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

Need to run .jar from console for it to work

我有一个 java 应用程序。 我正在使用 eclipse 编写、编译和创建一个 运行nable .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 有什么区别? 为什么它会影响多播消息?

我正在使用 "Package required libraries into generated JAR"。 我在 eclipse 中使用 java 1.7,在 Linux 中使用 1.8,也许这就是问题所在?但是为什么 运行 从控制台工作? 如果我用sudo我会明白,但我没有。

当您从控制台运行安装任何 jar 时,Console/Terminal 知道哪个程序负责 运行 任何 jar,即

java -jar example.jar 

但是当 double-clicking 环境时,OS/GUI 管理器不知道 运行 jar 的默认负责程序。 (同样,当您尝试打开一些未知的扩展文件时,操作系统会询问您 open with which program/application)

要使 Java 默认打开 .jar 文件(即双击),右键单击任何 .jar 文件以 select 属性。在下面的 window select "Open With" 选项卡中查看例如以下选择:

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

user.dir

这是我在 main 中调用的第一个函数。它在 eclipse 中不起作用,所以我将提出一个禁用它的论点(它只会在开发期间被禁用)。

static void setCurrentDir() throws URISyntaxException{
    String s;
    s = ESP8266_Configurator.class.getProtectionDomain().getCodeSource().getLocation().toURI().getPath();
    s = s.substring(0, s.lastIndexOf('/'));
    System.setProperty("user.dir",s);
}

我希望这对某人有所帮助。代码应该和解压出来的库一起导出,不要打包,否则不起作用。