Автономный пакет 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
вручную (лучше проверить это тщательно!).
Поэтому я предлагаю следующий обходной путь:
- Создайте каталог приложения, используя
javapackager -deploy -native image
- копия
java.exe
от вашей общесистемной установки JRE до{OUTDIR}\runtime\bin
(проверьте, распространяется ли ваша лицензия на распространение java.exe!) - Создайте файл.bat внутри
{OUTDIR}
что вызываетruntime\bin\java.exe -jar ./app/yourapp.jar
, - Теперь добавьте
{OUTDIR}
в ваш установщик.msi или innosetup, файл.zip или любой другой способ распространения, который вы выберете;-)
Затем вы можете вызвать файл bat вместо exe. Так как это просто обертка для java -jar
он будет ждать, пока ваша программа не закончится.