Exe, созданный с помощью Jpackage, загружает неправильную jvm.dll

Я пытаюсь создать пакет 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)

Любая идея, что я могу делать неправильно?

Это работает без аргументов--vm=client?

jewelsea 30.01.2023 01:36

Да, это работает. Сгенерированная среда выполнения имеет каталог server, и приложение запускается

Andrea Vacondio 30.01.2023 12:15

Какой JDK-19 вы используете? Этот параметр просто выдает мне сообщение об ошибке: jlink --vm=client --add-modules java.base --output myruntime.

DuncG 30.01.2023 19:02

Я использую Liberica, и вы правы, при использовании Oracle jdk --vm=client выдает ошибку, а без него, кажется, по умолчанию используется значение server (подкаталог lib содержит только версию сервера). С Liberica, опустив параметр, он генерирует server, client и minimal.

Andrea Vacondio 31.01.2023 10:25
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
4
67
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Не используйте опцию 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.

Andrea Vacondio 31.01.2023 10:28

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