Автономные приложения

Я смотрел несколько онлайн-презентаций, в которых кратко упоминались автономные приложения в Java 9, но у меня есть вопрос, который я хотел бы прояснить.

С новой модульной системой вам теперь разрешено включать только минимальный объем кода, необходимый для запуска вашего приложения. Однако требует ли система, которая желает запустить приложение, JRE или это то, что может быть включено в базовый модуль в программе?

Я подозреваю, что это последнее, поскольку на странице ( здесь) для загрузки новейшей версии Java по-прежнему отображается версия 8_151.

TL; DR - Используя Java 9, возможно ли создать автономный исполняемый файл, который может выполняться в системе без установленной JRE/Java?

2 ответа

Решение

Да, это возможно сjlink, но весь ваш код и ваши зависимости должны быть модульными JAR (т.е. с 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 присваивает имена модулям, которые вы хотите, чтобы ваш образ времени выполнения содержал - все его (их) транзитивные зависимости включены
  • --launcher необязательно, но очень удобно; он создает специфичную для ОС панель запуска (например, .bat в Windows) с указанным именем (launch-app) который запускает указанный модуль (your.app; в этом случае, если для него определен основной класс)
  • --output указывает, где создать образ во время выполнения

Кроме того, вы можете использовать javapackager инструмент.

Инструменты упаковки Java обеспечивают встроенную поддержку нескольких форматов автономных пакетов приложений.

Базовый пакет представляет собой одну папку на жестком диске, которая включает в себя все ресурсы приложения и JRE. Пакет можно распространять как есть, или вы можете создать устанавливаемый пакет (например, в формате EXE или DMG).

Хотя есть определенные ограничения, связанные с созданием этих приложений с javapackager который включает в себя -

  • Самостоятельные пакеты приложений должны быть явно запрошены путем передачи собственного аргумента в задачу Ant или команду javapackager -deploy.

  • Автономные пакеты приложений должны быть построены в операционной системе, в которой они предназначены. Необходимые инструменты должны быть доступны для сборки пакета в определенном формате.

  • Автономные пакеты приложений могут быть собраны только с использованием JDK 7 Update 6 или более поздней версии. Java Packager для JDK 9 упаковывает приложения с образом выполнения JDK 9. Чтобы упаковать JRE JDK 8 или JDK 7 в ваше приложение, используйте Java Packager JDK 8.


Одним из способов создания базового автономного приложения является изменение deploy Задача муравья:-

<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 командный инструмент. Команда 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"

Это сработало для меня. Он включает JRE в папку приложения и создает исполняемый файл. У меня были файлы java-файлов в папке src, и эта команда скомпилировала и создала папку dist с исполняемым файлом.

javapackager -makeall -name WordAnalyzer_app -appclass queue.Gui
pause
Другие вопросы по тегам