Для работы нужно запустить.jar из консоли.
У меня есть 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;
}
Код работает, когда я запускаю его из затмения. Это также работает, когда я запускаю.jar из консоли в Linux.
Но когда я запускаю его двойным щелчком, это не работает.
При запуске с консоли оно находит мое тестовое устройство менее чем за секунду. При запуске с двойным щелчком он не находит его никогда.
Я еще не тестировал его на Windows, но проблема все еще остается на Linux.
Какая разница, когда вы запускаете.jar из консоли или двойным щелчком мыши? Почему это влияет на сообщения на многоадресной рассылке?
Я использую "Упаковать необходимые библиотеки в сгенерированный JAR". Я использую Java 1.7 в Eclipse и 1.8 в Linux, может в этом проблема? Но почему работает с консоли? Я бы понял, если бы использовал sudo, но я не сделал.
2 ответа
Проблема была в текущем местоположении, системном свойстве
user.dir
Это первая функция, которую я вызываю в своей главной. Он не работает из затмения, поэтому я приведу аргумент для его отключения (он будет отключен только во время разработки).
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);
}
Я надеюсь, что это помогает кому-то. Код следует экспортировать с извлеченными библиотеками, а не упаковывать, иначе он не будет работать.
Когда вы запускаете любой jar из консоли, Console/Terminal знает, какая программа отвечает за запуск любого jar, т.е.
java -jar example.jar
но при двойном щелчке по среде диспетчер OS/GUI не знает ответственную программу по умолчанию для запуска jar. (Точно так же, когда вы пытаетесь открыть какой-то неизвестный файл расширения, операционная система попросит вас открыть, с какой программой / приложением)
Чтобы заставить Java открывать файлы.jar по умолчанию (т.е. двойной щелчок), щелкните правой кнопкой мыши любой файл.jar и выберите "Свойства". В следующем окне выберите вкладку "Открыть с помощью", чтобы увидеть, например, следующий вариант: