我有一个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,我会理解,但我没有。
答案 0 :(得分:0)
当您从控制台运行任何jar时,控制台/终端知道哪个程序负责运行任何jar,即
java -jar example.jar
但是当双击环境时,OS / GUI管理器不知道默认的负责程序来运行jar。 (当您尝试打开某个未知的扩展文件时,操作系统会询问您打开哪个程序/应用程序)
要使Java默认打开.jar文件(即双击),请右键单击任何.jar文件以选择“属性”。在以下窗口中,选择“打开方式”选项卡以查看例如以下选择:
答案 1 :(得分:0)
问题出在当前位置,系统属性
user.dir来
这是我在main中调用的第一个函数。它不适用于eclipse,所以我会提出一个禁用它的参数(它只会在开发过程中被禁用)。
{{1}}
我希望这有助于某人。代码应该使用提取的库导出,而不是打包,否则它不起作用。