Я пытаюсь создать пакет Windows для моего приложения JavaFX, используя JPackage. Я использую Liberica JDK 19, и мои сценарии сначала генерируют среду выполнения, используя JLink с аргументом --vm=client
, а затем запускают jpackage с --runtime-image
, указывающим на сгенерированное изображение.
Все работает нормально, когда я запускаю приложение, сгенерированное jpackage, с помощью сценария .bat, но когда я запускаю сгенерированный .exe, я получаю сообщение об ошибке, и, глядя на отладочную информацию, кажется, что .exe загружает jvm.dll из runtime\bin\server
вместо папки runtime\bin\client
:
[TRACE] app.cpp:123: Entering app::launch
[TRACE] AppLauncher.cpp:116: Launcher config file path: "C:\delete\pdfsam-5.0.0-SNAPSHOT-windows\pdfsam\app\pdfsam.cfg"
[TRACE] JvmLauncher.cpp:44: Jvm(000001319907E960)::Jvm()
[TRACE] AppLauncher.cpp:76: Property "app.runtime" not found in "Application" section of launcher config file. Using Java runtime from "C:\delete\pdfsam-5.0.0-SNAPSHOT-windows\pdfsam\runtime" directory
[TRACE] JvmLauncher.cpp:49: Jvm(000001319907E960)::~Jvm()
[TRACE] app.cpp:123: Entering app::launch
[TRACE] AppLauncher.cpp:116: Launcher config file path: "C:\delete\pdfsam-5.0.0-SNAPSHOT-windows\pdfsam\app\pdfsam.cfg"
[TRACE] JvmLauncher.cpp:44: Jvm(00000200C91AE310)::Jvm()
[TRACE] AppLauncher.cpp:76: Property "app.runtime" not found in "Application" section of launcher config file. Using Java runtime from "C:\delete\pdfsam-5.0.0-SNAPSHOT-windows\pdfsam\runtime" directory
[TRACE] WinLauncher.cpp:216: SetDllDirectory to: C:\delete\pdfsam-5.0.0-SNAPSHOT-windows\pdfsam\runtime\bin
[TRACE] WinLauncher.cpp:73: Entering `anonymous-namespace'::loadDllWithAddDllDirectory
[TRACE] WinLauncher.cpp:89: AddDllDirectory(C:\delete\pdfsam-5.0.0-SNAPSHOT-windows\pdfsam\runtime\bin): OK
[TRACE] WinLauncher.cpp:97: LoadLibraryEx(C:\delete\pdfsam-5.0.0-SNAPSHOT-windows\pdfsam\runtime\bin\jli.dll, LOAD_LIBRARY_SEARCH_DEFAULT_DIRS): 00007FFCCB100000
[TRACE] WinLauncher.cpp:0: Exiting `anonymous-namespace'::loadDllWithAddDllDirectory (entered at WinLauncher.cpp:73)
[TRACE] WinLauncher.cpp:73: Entering `anonymous-namespace'::loadDllWithAddDllDirectory
[TRACE] WinLauncher.cpp:0: Exiting `anonymous-namespace'::loadDllWithAddDllDirectory (entered at WinLauncher.cpp:73)
[TRACE] WinLauncher.cpp:52: Entering `anonymous-namespace'::loadDllWithAlteredPATH
[TRACE] WinLauncher.cpp:62: New value of PATH: SOME PATH HERE;C:\delete\pdfsam-5.0.0-SNAPSHOT-windows\pdfsam\app;C:\delete\pdfsam-5.0.0-SNAPSHOT-windows\pdfsam\runtime\bin\server
[TRACE] WinLauncher.cpp:0: Exiting `anonymous-namespace'::loadDllWithAlteredPATH (entered at WinLauncher.cpp:52)
[TRACE] JvmLauncher.cpp:49: Jvm(00000200C91AE310)::~Jvm()
[ERROR] app.cpp:179: Exception with message 'WinDll.cpp(40) at `anonymous-namespace'::loadLibrary(): LoadLibraryW(C:\delete\pdfsam-5.0.0-SNAPSHOT-windows\pdfsam\runtime\bin\server\jvm.dll) failed. System error [126](system error 126 (Impossibile trovare il modulo specificato))' caught
LoadLibraryW(C:\delete\pdfsam-5.0.0-SNAPSHOT-windows\pdfsam\runtime\bin\server\jvm.dll) failed. System error [126](system error 126 (Impossibile trovare il modulo specificato))
[TRACE] app.cpp:0: Exiting app::launch (entered at app.cpp:123)
Любая идея, что я могу делать неправильно?
Да, это работает. Сгенерированная среда выполнения имеет каталог server
, и приложение запускается
Какой JDK-19 вы используете? Этот параметр просто выдает мне сообщение об ошибке: jlink --vm=client --add-modules java.base --output myruntime
.
Я использую Liberica, и вы правы, при использовании Oracle jdk --vm=client
выдает ошибку, а без него, кажется, по умолчанию используется значение server
(подкаталог lib содержит только версию сервера). С Liberica, опустив параметр, он генерирует server
, client
и minimal
.
Не используйте опцию jlink
:
--vm=client
По крайней мере, для Oracle JDK и, возможно, для других дистрибутивов JDK клиентская виртуальная машина больше не является частью дистрибутива:
В Oracle Java Runtime Environment (JRE) 8 и более ранних версиях различные реализации JVM (клиентская виртуальная машина, серверная виртуальная машина и минимальная виртуальная машина) поддерживались для конфигураций, обычно используемых в качестве клиентов, серверов и встроенных систем. Поскольку большинство систем теперь могут использовать преимущества серверной виртуальной машины, Oracle Java Runtime Environment (JRE) 9 предоставляет только эту реализацию виртуальной машины.
В документации jlink говорится:
Плагины, не перечисленные в этом разделе, не поддерживаются и могут быть изменены.
Плагин vm
не указан в документации, поэтому его не следует использовать.
Спасибо, это полезно. Также цитируя мой комментарий в ответ на комментарий @DuncG: я использую Liberica... с помощью Oracle jdk --vm=client
выдает ошибку, в то время как без него кажется, что по умолчанию используется значение server
(подкаталог lib содержит только версию сервера). С Liberica, опустив параметр, он генерирует server
, client
и minimal
.
Это работает без аргументов
--vm=client
?