Теперь это работает так: вы конвертируете свою программу в модуль, а затем «связываете» ее со всеми другими необходимыми ей модулями.
Результатом этого процесса связывания является то, что называется изображением.Изображение на самом деле представляет собой файловое дерево, которое включает в себя каталог bin
с одним или несколькими готовыми к запуску исполняемыми файлами.Это дерево - то, что вы распространяете, как правило, в виде zip или tar.gz.
Шаги:
- Создание модуля-info.java
- Компиляция спуть к модулю вместо пути к классам
- Как обычно, создайте jar из классов
- Преобразуйте jar в jmod с помощью инструмента JDK
jmod
- Ссылка на этот 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