2

我有一个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,我会理解,但我没有。

4

2 回答 2

0

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

java -jar example.jar 

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

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

在此处输入图像描述

于 2017-06-05T09:12:57.643 回答
0

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

用户目录

这是我在 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);
}

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

于 2017-06-05T11:57:55.967 回答