Автономные приложения, встроенные в 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"