Автономные приложения, встроенные в Java
Я смотрел несколько онлайн-презентаций, в которых кратко упоминались автономные приложения в Java 9, но у меня есть вопрос, который я хотел бы прояснить.
Благодаря новой модульной системе вам теперь разрешено включать только минимальный объем кода, необходимый для запуска вашего приложения. Тем не менее, требует ли система, которая хочет запустить приложение, JRE или это то, что может быть включено в базовый модуль в программе?
Я подозреваю, что последнее, так как на странице (здесь) для загрузки новейшей версии Java все еще отображается версия 8_151.
TL; DR - Используя Java 9, возможно ли создать автономный исполняемый файл, который может выполняться в системе без установленной JRE/Java?
Ответы
Ответ 1
JLINK
Да, это возможно с помощью jlink
(JEP 282), но весь ваш код и ваши зависимости должны быть модульными JAR module-info.class
(т. module-info.class
С module-info.class
). Это работает так:
jlink
--module-path $JAVA_HOME/jmods:mods
--add-modules your.app
--launcher launch-app=your.app
--output your-app-image
В деталях:
-
--module-path
перечисляет папки, которые содержат модули - сюда должны быть включены модули платформы, поставляемые с JDK, который вы хотите использовать (в $JAVA_HOME/jmods
), и модули вашего приложения (mods
) -
--add-modules
имена --add-modules
которые вы хотите, чтобы ваш образ времени выполнения содержал - все его (их) транзитивные зависимости включены -
--launcher
необязателен, но очень удобен; он создает специфическую для ОС панель запуска (например, .bat
в Windows) с заданным именем (launch-app
), которая запускает указанный модуль (your.app
; в данном случае, если для него определен основной класс) -
--output
указывает, где создать образ времени выполнения
Ответ 2
javapackager
Кроме того, вы можете использовать инструмент javapackager
(JEP 343).
Инструменты упаковки Java обеспечивают встроенную поддержку нескольких форматов автономных пакетов приложений.
Базовый пакет представляет собой одну папку на жестком диске, которая включает в себя все ресурсы приложения и JRE. Пакет можно распространять как есть, или вы можете создать устанавливаемый пакет (например, в формате EXE или DMG).
Хотя есть определенные ограничения, связанные со javapackager
этих приложений с помощью javapackager
который включает в себя:
-
Автономные пакеты приложений должны быть явно запрошены путем передачи собственного аргумента в задачу Ant или команду javapackager -deploy.
-
Автономные пакеты приложений должны быть построены в операционной системе, в которой они предназначены. Необходимые инструменты должны быть доступны для сборки пакета в определенном формате.
-
Автономные пакеты приложений могут быть собраны только с использованием JDK 7 Update 6 или более поздней версии. Java Packager для JDK 9 упаковывает приложения с образом выполнения JDK 9. Чтобы упаковать JRE JDK 8 или JDK 7 с вашим приложением, используйте Java Packager JDK 8.
Один из способов создания базового автономного приложения - изменить задачу deploy
ant:
<fx:deploy width="${javafx.run.width}" height="${javafx.run.height}"
nativeBundles="all"
outdir="${basedir}/${dist.dir}" outfile="${application.title}">
<fx:application name="${application.title}" mainClass="${javafx.main.class}"/>
<fx:resources>
<fx:fileset dir="${basedir}/${dist.dir}" includes="*.jar"/>
</fx:resources>
<fx:info title="${application.title}" vendor="${application.vendor}"/>
</fx:deploy>
Собственные пакеты могут быть javapackager
командного инструмента javapackager
. Команда Java Packager для генерации автономных пакетов приложений будет выглядеть примерно так:
javapackager -deploy -native -outdir OUTPUT_DIR -outfile APPLICATION_NAME
-srcdir PACKAGE_SRC_DIR -srcfiles APPLICATION.jar -appclass MAIN_CLASS
-name "YourApplication" -title "SelfContained"