Как развернуть приложение JavaFX 11 Desktop с помощью JRE - PullRequest
0 голосов
/ 24 ноября 2018

У меня есть настольное бизнес-приложение JavaFX (JDK 8), которое использует Java Web Start для развертывания.У пользователей установлена ​​Java 8, и они просто переходят по URL-адресу (общедоступному URL-адресу на моем сервере AWS Linux), и приложение загружается / запускается (с помощью Web Start).Я также могу легко обновить приложение, развернув новые JAR-файлы на сервере.Все работает хорошо.

Однако Oracle прекратила Web Start с Java 11, и в своем официальном документе «Обновление дорожной карты клиента Java», март 2018 г., они рекомендуют связать JRE с приложением («Понятиепоэтому приложение, распространяемое отдельно от отдельной JRE, быстро исчезает ».)Я не могу полагаться на то, что мои пользователи останутся на Java 8 для Web Start, и даже если они останутся на 8, Oracle требует лицензии для продолжения использования Java 8 (чего у меня нет, может быть очень дорого, и я бы предпочелВ любом случае, чтобы двигаться вместе с сообществом к JavaFX 11 и OpenJDK).

Я бы хотел перейти на JavaFX 11. Я следовал OpenJFX «Начало работы с JavaFX11» (https://openjfx.io/openjfx-docs/), с использованием OpenJDK 11.0.1с Gluon JavaFX SDK 11.0.1 (на Netbeans 10vc2), и я смог запустить примеры приложений (и, как мне кажется, я мог бы легко перенести свой код JavaFX 8 на JavaFX 11).

Однако это то место, где я застрял в направлении. Как связать это с JRE и развернуть это для моих конечных пользователей (и предоставить обновления приложений)? Есть ли простой выход (или даже трудный путь), с некоторыми указаниями / руководствами)?

Я могу потратить сотни часов на написание выразительных, насыщенных и полезных бизнес-приложений для настольных компьютеров на JavaFX 11, но что мне делать?en?

Подходят ли инструменты развертывания, такие как JWrapper, InstallAnywhere и т. д., для этой новой эры Java 11?Есть ли у Gluon / openjfx.io рекомендации или руководства, которые я пропустил?Кажется, я не могу найти какие-либо рекомендации или руководства из авторитетных источников о том, как нам, разработчикам, которые сосредоточены на написании внешнего кода, развертывать приложения.

Спасибо за любую помощь или руководство.

Ответы [ 3 ]

0 голосов
/ 14 декабря 2018

Хосе: Я вижу, что мы должны решить одну и ту же проблему (см. Мой вопрос на Упаковка автономных приложений для приложения JavaFX в Windows: InnoSetup ИЛИ javafxpackager? ).Возможно, использование javapackager из JDK было бы «простым» решением, несмотря на многочисленные параметры.В моем случае с помощью этого инструмента мне удалось создать «Пакет автономных приложений для приложения JavaFX в Windows»?

0 голосов
/ 24 марта 2019

Попробуйте установить 4j.Это может быть вашим спасителем.

Проверьте эту статью, чтобы увидеть страдания другого разработчика:

https://voyagergames.com/distributing-a-desktop-java-application/

0 голосов
/ 24 ноября 2018

Теперь это работает так: вы конвертируете свою программу в модуль, а затем «связываете» ее со всеми другими необходимыми ей модулями.

Результатом этого процесса связывания является то, что называется изображением.Изображение на самом деле представляет собой файловое дерево, которое включает в себя каталог bin с одним или несколькими готовыми к запуску исполняемыми файлами.Это дерево - то, что вы распространяете, как правило, в виде zip или tar.gz.

Шаги:

  1. Создание модуля-info.java
  2. Компиляция спуть к модулю вместо пути к классам
  3. Как обычно, создайте jar из классов
  4. Преобразуйте jar в jmod с помощью инструмента JDK jmod
  5. Ссылка на этот jmod имодули, от которых он зависит, в образ

Написание дескриптора модуля

Первый шаг - превратить приложение в модуль.Как минимум, для этого требуется создать module-info.java в верхней части дерева исходных текстов (то есть в пустом пакете).У каждого модуля есть имя, которое часто совпадает с именем пакета, но не обязательно.Итак, ваш module-info.java может выглядеть так:

module com.mcs75.businessapp {
    exports com.mcs75.desktop.businessapp;

    requires java.logging;
    requires transitive javafx.graphics;
    requires transitive javafx.controls;
}

Сборка

При сборке вы вообще не указываете путь к классам.Вместо этого вы указываете путь к модулю.

Путь к модулю - это список каталогов, а не файлов.Не удивительно, что каждый каталог содержит модули.Каталог jmods JDK включен неявно.Все, что вам нужно, это каталоги, содержащие не-JDK-модули, которые вам нужныВ вашем случае это как минимум означает JavaFX от Gluon:

javac -Xlint -g -d build/classes --module-path /opt/gluon-javafx/lib \
    src/java/com/mcs75/desktop/businessapp/*.java

Затем вы создаете банку обычным способом:

jar -c -f build/mybusinessapp.jar -C build/classes .

Файл jar с модулем-info.class в немсчитается модульным jar.

Создание jmod

Создание jmod обычно является простым процессом:

mkdir build/modules
jmod create --class-path build/mybusinessapp.jar \
    --main-class com.mcs75.desktop.businessapp.BuinessApplication \
    build/modules/mybusinessapp.jmod

Linking

Наконец, вы используетекоманда JDK jlink для сборки всего:

jlink --output build/image \
    --module-path build/modules:/opt/gluon-javafx/lib \
    --add-modules com.mcs75.businessapp \
    --launcher MyBusinessApp=com.mcs75.businessapp

jlink создает минимальный JRE, который содержит только те модули, которые вы явно добавили (и модули, которые требуются для этих явных модулей).--add-modules - обязательный параметр, который указывает, что нужно добавить.

Как и в случае с другими инструментами JDK, --module-path указывает каталоги, содержащие модули.

Параметр --launcher приводит к тому, что окончательное дерево изображенийиметь в своем каталоге bin дополнительный исполняемый скрипт с указанным именем (часть перед равенством).Итак, MyBusinessApp=com.mcs75.businessapp означает «создать исполняемый файл с именем MyBusinessApp, который выполняет модуль com.mcs75.businessapp».

Поскольку команда jmod create включала параметр --main-class, Java будет знать, что выполнять,как объявление атрибута Main-Class в манифесте.При желании также можно явно объявить класс для выполнения в параметре --launcher.

Распространение

То, что вы хотите распространять, - это zip или tar.gz всего изображения.Файловое дерево.Исполняемый файл, который должен запустить пользователь, находится в каталоге bin образа.Конечно, вы можете добавлять свои собственные исполняемые файлы.Вы также можете разместить его в любом виде установщика, если сохраняется структура дерева образов.

В будущем JDK будет иметь инструмент упаковки для создания полноценных собственных установщиков..

Перекрестное построение

Поскольку образ содержит собственные двоичные файлы, вам необходимо создать образ для каждой платформы.Очевидно, что одним из вариантов является создание образа в системе Linux, и снова в системе Windows, и снова на Mac и т. Д.

Но вы также можете использовать jmod и jlink для создания образовдля других платформ, независимо от того, где вы строите.

Требуется всего несколько дополнительных шагов.Во-первых, вам понадобятся JDK для этих других платформ.Загрузите их как архивы (zip или tar.gz), а не как установщики, и распакуйте их в каталоги по вашему выбору.

Каждый JDK определяет платформа строка.Это обычно имеет вид - .Платформа является собственностью модуля java.base;Вы можете увидеть любую платформу JDK, изучив этот модуль:

jmod describe path-to-foreign-jdk/jmods/java.base.jmod | grep '^platform'

Передайте эту строку платформы в команду jmod с помощью опции --target-platform:

mkdir build/modules
jmod create --target-platform windows-amd64 \
    --class-path build/mybusinessapp.jar \
    --main-class com.mcs75.desktop.businessapp.BuinessApplication \
    build/modules/mybusinessapp.jmod

Наконец, при соединении выЯ хочу явно включить другой каталог JDK jmods, чтобы jlink не включал неявно свои собственные модули JDK:

jlink --output build/image \
    --module-path path-to-foreign-jdk/jmods:build/modules:/opt/gluon-javafx/lib \
    --add-modules com.mcs75.businessapp \
    --launcher MyBusinessApp=com.mcs75.businessapp
...