需要从控制台运行.jar才能工作

时间:2017-06-05 08:40:41

标签: java linux multicast iotivity

我有一个java应用程序。 我使用eclipse编写,编译和创建一个可运行的.jar。

该程序用于发现OCF设备。

它使用UDP和组播。

多播代码

public static void sendMulticast(byte[] data) throws Exception{
        DatagramPacket pack = new DatagramPacket(data, data.length, mgroup, mport);
        msocket.send(pack);
    }
public static byte[] recieveMulticast(int timeout) throws Exception{
        DatagramPacket packet;
        byte[] data = new byte[AppConfig.ocf_buffer_size];

        packet = new DatagramPacket(data, data.length);
        msocket.setSoTimeout(timeout);
        msocket.receive(packet);

        return data;
    }

当我从eclipse启动它时代码有效。当我在Linux上从控制台运行.jar时,它也可以工作。

但是,当我双击启动它时,它无法正常工作。

从控制台启动时,它会在不到一秒的时间内找到我的测试设备。当双击启动时,它无法找到它。

我还没有在Windows上测试它,但问题仍然存在于Linux上。

从控制台启动.jar或双击时有什么区别? 为什么它会在多播上影响消息?

我正在使用"将所需的库打包到生成的JAR"中。 我在eclipse中使用java 1.7,在Linux上使用1.8,也许这就是问题所在?但是为什么从控制台运行呢? 如果我使用sudo,我会理解,但我没有。

2 个答案:

答案 0 :(得分:0)

当您从控制台运行任何jar时,控制台/终端知道哪个程序负责运行任何jar,即

java -jar example.jar 

但是当双击环境时,OS / GUI管理器不知道默认的负责程序来运行jar。 (当您尝试打开某个未知的扩展文件时,操作系统会询问您打开哪个程序/应用程序)

要使Java默认打开.jar文件(即双击),请右键单击任何.jar文件以选择“属性”。在以下窗口中,选择“打开方式”选项卡以查看例如以下选择:

enter image description here

答案 1 :(得分:0)

问题出在当前位置,系统属性

  

user.dir来

这是我在main中调用的第一个函数。它不适用于eclipse,所以我会提出一个禁用它的参数(它只会在开发过程中被禁用)。

{{1}}

我希望这有助于某人。代码应该使用提取的库导出,而不是打包,否则它不起作用。