Как запустить сгенерированный jlink образ среды выполнения Java без окна CMD?

Я создал образ среды выполнения Java для простого приложения OpenJFX. Чтобы запустить это приложение, jlink автоматически сгенерировал два сценария запуска в каталоге %image_path%/bin. Вот как это выглядит (тот, что для Windows):

@echo off
set JLINK_VM_OPTIONS=
set DIR=%~dp0
"%DIR%\java" %JLINK_VM_OPTIONS% -m app/com.package.Launcher %*

Очевидно, что когда я запускаю этот пакетный файл, он открывает новое окно оболочки, чего я не хочу. Я пробовал все распространенные подходы: использовать javaw вместо java, запускать скрипт через команду start и т. д. Ничего не работает.

Можно ли избежать окна оболочки или как-то создать собственный лаунчер?


person Evan    schedule 10.01.2019    source источник
comment
Если вы используете JavaFX 9 или 10, вы можете использовать инструмент javapackager. Поскольку это не так, вам придется дождаться JEP 343: Packaging Tool (см. также JDK-8212780), который предоставит новый инструмент с именем jpackage (ранее назывался jpackager).   -  person Slaw    schedule 11.01.2019


Ответы (4)


Хорошо, я понял, что полностью исключить окно оболочки невозможно. В лучшем случае он просто мерцает в течение ~ 1 секунды. Вот как это может быть достигнуто:

@echo off
set JLINK_VM_OPTIONS=
set DIR=%~dp0
start "" "%DIR%\javaw" %JLINK_VM_OPTIONS% -m app/com.package.Launcher %* && exit 0

Есть запрос на функцию нативной реализации запуска, но она активно не обсуждается.

Тем не менее я решил проблему. Есть инструмент "Пакетный конвертер в EXE". Он может генерировать исполняемый файл (в основном тот же пакетный файл), который может запускать ваше приложение без вывода сообщений.

person Evan    schedule 10.01.2019
comment
Не могли бы вы добавить ссылку на инструмент пакетного преобразования в EXE? - person Perdi Estaquel; 26.07.2019
comment
@PerdiEstaquel, возможно, Эван имел в виду это: battoexeconverter.com? - person wcobalt; 12.08.2019
comment
Лучше использовать JDK_JAVA_OPTIONS вместо JLINK_VM_OPTIONS, так как он является внутренним для JVM для его выполнения - docs.oracle.com/javase/9/tools/java.htm#JSWOR624 - person Marc Magon; 04.11.2019

Это выглядит возможным с помощью vbscript. Если вы поместите следующий скрипт в файл .vbs рядом с файлом launcher.bat (или любым другим именем пакетного файла):

CreateObject("Wscript.Shell").Run CreateObject("Scripting.FileSystemObject").GetParentFolderName(WScript.ScriptFullName) & "\launcher.bat " & WScript.Arguments(0) & " > " & CreateObject("Scripting.FileSystemObject").GetParentFolderName(WScript.ScriptFullName) & "\launch-log.log", 0, False

Это запускает пакетный файл в том же каталоге, а также перенаправляет стандартный вывод в файл журнала.

person Matt Harrison    schedule 13.08.2019

То, чего вы хотите достичь, вполне возможно. На самом деле это даже довольно просто, и я использую это каждый день. Здесь уже доступна сборка jpackage для раннего доступа: http://jdk.java.net/jpackage/ Создание исполняемых файлов уже хорошо работает (я использую это на Mac и Windows). Только создание установщиков все еще немного проблематично.

person mipa    schedule 13.08.2019

Очень легко запустить bat-файл, не показывая окно cmd. вам просто нужно создать файл VBS для запуска файла bat со следующей командой cmd

Set WshShell = CreateObject("WScript.Shell") 
WshShell.Run chr(34) & ".\bin\launcher.bat" & Chr(34), 0
Set WshShell = Nothing

Сохраните cmd в файл из папки bin под любым именем, например Launcher.vbs.

person yanki Boy    schedule 26.09.2020