Автономный пакет Java ожидает завершения

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

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

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

1 ответ

Я могу подтвердить это поведение для приложений, которые я упаковал с помощью 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 он будет ждать, пока ваша программа не закончится.

Другие вопросы по тегам