#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 в отношении автоматических модулей.