jlink не использует автоматические модули

#java #jpackage

#java #jpackage

Вопрос:

Я создал файл ‘.exe’ для приложения JavaFX в Windows 10, используя jpackage. После этого, при двойном щелчке по значку приложения, приложение не запустилось. Я понял, что ошибочно использовал эту команду, которая не предназначена ни для одного модульного приложения:

 jpackage --input app-directory --main-jar jar-file [--main-class main-class]
  

Теперь я пытаюсь использовать правильный синтаксис команды из документа Oracle для модульного приложения:

 jpackage --module-path module-path --module main-module[/class]
  

Вот моя команда, основанная на синтаксисе, заданном Oracle:

 jpackage -p "%JAVAFX_HOME%lib;%M2_REPO%;orgopenjfxmavenfxedittableviewmavenfxedittableview.jar" --module "org.openjfx.mavenfxedittableview/org.openjfx.mavenfxedittableview.TableEditApp"
  

Однако я получаю сообщение об ошибке, касающейся jlink, не использующего автоматические модули: Сообщение об ошибке:

 WARNING: Using incubator modules: jdk.incubator.jpackage
jlink failed with: Error: automatic module cannot be used with jlink: javafx.swt from file:///C:/Program Files/java/jFX/javafx-sdk-14.0.2.1/lib/javafx-swt.jar
  

Имя моего модуля приложения в module-info.class является

 module org.openjfx.mavenfxedittableview {
requires javafx.controls;
requires javafx.fxml;
requires java.base;
requires java.prefs;
requires transitive java.xml.bind;

opens org.openjfx.mavenfxedittableview to java.xml.bind, javafx.fxml;
exports org.openjfx.mavenfxedittableview;
    
}
  

Основным приложением является org.openjfx.mavenfxedittableview.TableEditApp и структура каталогов orgopenjfxmavenfxedittableview — это относительный путь в «c:sample » каталог.

Классы сборки являются:

  Directory of C:Sampleorgopenjfxmavenfxedittableview

09/09/2020  10:32 PM    <DIR>          .
09/09/2020  10:32 PM    <DIR>          ..
09/09/2020  08:36 PM             2,502 addressBookData.xml
09/09/2020  08:36 PM             9,562 Address_Book.png
09/09/2020  08:36 PM               859 birthdaystatistic.fxml
09/09/2020  08:36 PM             3,274 BirthdaystatisticController.class
09/09/2020  08:36 PM             3,224 DarkTheme.css
09/09/2020  08:36 PM             2,072 DateUtil.class
09/09/2020  08:36 PM             1,214 LocalDateAdapter.class
09/09/2020  10:32 PM            34,004 mavenfxedittableview.jar
09/09/2020  08:36 PM             3,523 Person.class
09/09/2020  08:36 PM             4,535 personeditdialog.fxml
09/09/2020  08:36 PM             5,128 PersoneditdialogController.class
09/09/2020  08:36 PM             1,029 PersonListWrapper.class
09/09/2020  08:36 PM             6,412 personoverview.fxml
09/09/2020  08:36 PM             1,904 rootlayout.fxml
09/09/2020  08:36 PM             4,490 RootlayoutController.class
09/09/2020  08:36 PM             9,060 TableEditApp.class
09/09/2020  08:36 PM             6,812 TableVieweditController.class
              17 File(s)         99,604 bytes
               2 Dir(s)  56,574,193,664 bytes free 
  

Вот содержимое файла jar приложения:

      0 Wed Sep 09 22:32:14 IRDT 2020 META-INF/
   125 Wed Sep 09 22:32:14 IRDT 2020 META-INF/MANIFEST.MF
  2502 Wed Sep 09 20:36:28 IRDT 2020 org/openjfx/mavenfxedittableview/addressBookData.xml
  9562 Wed Sep 09 20:36:28 IRDT 2020 org/openjfx/mavenfxedittableview/Address_Book.png
   859 Wed Sep 09 20:36:28 IRDT 2020 org/openjfx/mavenfxedittableview/birthdaystatistic.fxml
  3274 Wed Sep 09 20:36:30 IRDT 2020 org/openjfx/mavenfxedittableview/BirthdaystatisticController.class
  3224 Wed Sep 09 20:36:28 IRDT 2020 org/openjfx/mavenfxedittableview/DarkTheme.css
  2072 Wed Sep 09 20:36:30 IRDT 2020 org/openjfx/mavenfxedittableview/DateUtil.class
  1214 Wed Sep 09 20:36:30 IRDT 2020 org/openjfx/mavenfxedittableview/LocalDateAdapter.class
  3523 Wed Sep 09 20:36:30 IRDT 2020 org/openjfx/mavenfxedittableview/Person.class
  4535 Wed Sep 09 20:36:28 IRDT 2020 org/openjfx/mavenfxedittableview/personeditdialog.fxml
  5128 Wed Sep 09 20:36:30 IRDT 2020 org/openjfx/mavenfxedittableview/PersoneditdialogController.class
  1029 Wed Sep 09 20:36:30 IRDT 2020 org/openjfx/mavenfxedittableview/PersonListWrapper.class
  6412 Wed Sep 09 20:36:28 IRDT 2020 org/openjfx/mavenfxedittableview/personoverview.fxml
  1904 Wed Sep 09 20:36:28 IRDT 2020 org/openjfx/mavenfxedittableview/rootlayout.fxml
  4490 Wed Sep 09 20:36:30 IRDT 2020 org/openjfx/mavenfxedittableview/RootlayoutController.class
  9060 Wed Sep 09 20:36:30 IRDT 2020 org/openjfx/mavenfxedittableview/TableEditApp.class
  6812 Wed Sep 09 20:36:30 IRDT 2020 org/openjfx/mavenfxedittableview/TableVieweditController.class
   349 Wed Sep 09 22:32:14 IRDT 2020 module-info.class
  

Это файл манифеста jar:

 Manifest-Version: 1.0
Main-Class: org.openjfx.mavenfxedittableview.TableEditApp
Created-By: 14.0.2 (Oracle Corporation)
  

Наконец, я узнал об этом модитекте плагина Maven:

 https://www.youtube.com/watch?v=BhuOSGrNBek
  

, который встраивает дескриптор в файл jar автоматического модуля, однако это было бы чрезвычайно утомительно и отнимает много времени, поскольку автоматический модуль-виновник даже не находится в моем дескрипторе модуля. Это означает, что мне, возможно, придется просматривать репозиторий .m2 и конвертировать их один за другим. Есть ли лучшие обходные пути?

Спасибо

Ответ №1:

Возможно, вы захотите следовать этому руководству:https://github.com/dlemmermann/JPackageScriptFX Он также использует jpackage и jlink, но таким образом, что делает его пригодным для немодульных проектов. Вы не можете использовать jlink напрямую, потому что он не поддерживает автоматические модули, но этой проблемы можно избежать, просто не используя модульную систему вообще.

Комментарии:

1. @minpa: Спасибо за руководство. Я следовал инструкциям в руководстве, модифицировал свой собственный pom и модифицировал скрипт командной строки для создания файла «.exe» для приложения. Я запускаю файл «.exe» и устанавливаю приложение на свой Windows 10, но я наблюдал тот же симптом, что и описанный в моем сообщении, который заключается в двойном щелчке по значку приложения, не запускает приложение. Мне удалось запустить приложение из командной строки, используя основной класс, а также используя технику AppLauncher, которая была представлена в руководстве. Нужно ли мне создавать образ MSI, а не «.exe»?

2. Кстати, я создал «.exe» для руководства, установил его в своей системе, и я смог запустить приложение, дважды щелкнув по значку. Однако мое приложение немного более надуманное, использует несколько диалоговых окон и использует JAXB для хранения данных в файловой системе. Однако, как я уже указывал, я смог запустить приложение, используя файл app jar, а также через AppLauncher из командной строки.

3. Чтобы получить реальный пользовательский опыт в Windows, я бы рекомендовал создать установщик MSI. По крайней мере, это то, что я делаю. После установки приложение можно использовать как любое другое приложение в системе.

4. Вы абсолютно правы в отношении установщика MSI, он намного быстрее и эффективнее, несмотря на тип установщика, увы, проблема сохраняется. У меня есть подозрение, что jpackage или jlink не включают некоторые библиотеки или артефакты в комплект. Время поместить некоторые журналы в AppLauncher и основной класс.

5. Интересно, что в журнале не сообщается об исключениях или ошибках. Это сложная задача, и она останется загадкой :-), ну что ж, спасибо за руководство, оно, безусловно, обходит ограничения jlink в отношении автоматических модулей.