Автономный пакет Java ожидает завершения - PullRequest
0 голосов
/ 12 февраля 2019

У меня есть приложение, которое должно быть автономным, устанавливаемым на компьютерах, которые могут не иметь Java.Я использую команду javapackager для создания EXE-файла, который можно отправить пользователям, содержащего все необходимые части.В простом смысле приложение читает файл, на который ссылается первый параметр, выполняет преобразования в нем и записывает результат рядом с исходным файлом.Все это работает, когда он запускается как JAR-файл напрямую, а также при запуске через встроенный EXE-файл.

Проблема заключается в том, что при запуске исполняемого файла он немедленно возвращает выполнение в командную строку, а не ожидаетпроцесс до конца.Я не хочу опрашивать выходной каталог, чтобы проверить, существует ли файл, а затем дать произвольный тайм-аут, когда нужно перестать искать - я хочу, чтобы приложение знало, что после завершения команды консоли обработка завершена.В это время я могу выполнять логику, основываясь на том, нашел ли я файл результатов, и предупредить, если он не найден, или какая-либо другая логика верна.

Есть ли способ сообщить команде javapackager, чтобы установитьждать, пока Java не умрет (хорошо или плохо), прежде чем вернуть контроль?Кроме этого, есть ли фрагмент кода / концепция, которая заставила бы приложение удерживаться, выпуская управление обратно в терминал, пока JVM не умерла?

1 Ответ

0 голосов
/ 12 февраля 2019

Я могу подтвердить это поведение для приложений, которые я упаковал с использованием javapackager, включенных в Oracle JDK 8, 9 и 10, а также со снимками из OpenJDK 13. В то время как полученные двоичные файлы ведут себя «как положено» в macOS и Linuxдвоичный файл Windows, по-видимому, просто порождает новый процесс и немедленно завершается.

Начиная с Java 9 jpackager вызывает jlink внутри, который имеет опцию --strip-native-commands, которая в основном удаляет двоичные файлы из встроенной JRE.В Java 8 у вас не было этой опции, а исполняемые файлы, такие как java.exe, всегда удаляются.Но мои тесты показывают, что в противном случае JRE завершена, и вы должны иметь возможность просто включить java.exe вручную (лучше это тщательно проверить!).

Поэтому я предлагаю следующий обходной путь:

  1. Создайте каталог приложения, используя javapackager -deploy -native image
  2. Скопируйте java.exe из общесистемной установки JRE в {OUTDIR}\runtime\bin (проверьте, распространяется ли ваша лицензия на распространение java.exe!)
  3. Создайте файл .bat внутри {OUTDIR}, который вызывает runtime\bin\java.exe -jar ./app/yourapp.jar.
  4. Теперь добавьте {OUTDIR} в ваш установщик .msi или innosetup или файл .zip или любой другой способ распространения, который вы выберете;-)

Вы можете затем вызвать файл bat вместо exe.Поскольку это просто оболочка для java -jar, она будет ждать, пока ваша программа не завершится.

...