У меня есть код, который использует Runtime.exec() для запуска внешнего .jar(созданного как установщик IzPack).
Если я запустил этот файл external.jar из командной строки следующим образом:
java -jar external.jar
Затем командная строка не возвращает управление, пока приложение не будет завершено. Однако, если я запускаю external.jar из некоторого java-класса, используя:
Process p = Runtime.getRuntime().exec("java -jar external.jar");
int exitCode = p.waitFor();
System.out.println("Process p returned: " + exitCode);
Затем p
возвращается почти мгновенно с кодом успеха 0
, несмотря на то, что external.jar еще не завершил выполнение (я также пробовал это с помощью трассировки внешнего файла ProcessBuilder
).
Почему он ждет возврата из командной строки, но не при выполнении из другой Java-программы?
Я также установил 3 баночки, A, B и C, где A вызывает B, который вызывает C (используя Runtime.exec()
), где C Thread.sleep
в течение 10 секунд, как простой тест, и, как ожидалось, A не возвращается до 10 секунд после его запуска.
Я полагаю, что это, вероятно, какая-то проблема с threading с внешним .jar, где исполнение передается от одной вещи к другой, но учитывая, что она работает непосредственно из командной строки, я ожидаю увидеть такое же поведение ( возможно наивно) при вызове из другой Java-программы.
Я тестировал это на Windows и Ubuntu с Java 6.
Спасибо!