Рубрики
Без рубрики

JavaFX, Jlink и пакет

Несколько дней назад для группы пользователей Java Трентино-Альто-Адидже-Зюдтироль я показал некоторые эксперименты на Java… С тегами java, javafx, jlink, пакет.

Несколько дней назад, для Я показываю некоторые эксперименты на JavaFX , Группе пользователей Java Трентино-Альто-Адидже-Зюдтироль Ссылка и Посылка . Цель выступления состояла в том, чтобы показать возможность использования JavaFX для работы с новыми инструментами JDK, такими как Jlink (начиная с OpenJDK 9) и JPackage (предоставляемый новым OpenJDK 16) для разработки расширенных клиентов. Хотя некоторые могут заявить « JavaFX мертв », поскольку он не является частью Открытый JDK теперь JavaFX на самом деле жив и здоров. Открытый JFX (он же Open JavaFX) – это побочный проект, который все еще поддерживается и развивается Oracle, Gluon, BellSoft и другими. Внезапно, из-за появления OpenJDK, внедрения и других бесплатных сборок OpenJDK, может оказаться не так просто понять, как начать работу с JavaFX, особенно если вы все еще работаете над дистрибутивом Oracle Jave SE 1.8.0. Давайте попробуем добраться туда.

Перед началом

Чтобы понять этот пример, вам нужно:

  • Мерзавец
  • Апач Мавен
  • Sdkман
  • оболочка Linux или оболочка Wsl2 для Windows (извините, я ничего не знаю о macOS)
  • редактор для файла pom (даже Vim подойдет, но я не помню, как из него выйти, так что не спрашивайте меня).

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ Имейте в виду, что я напишу о модуле-информация и Система модулей платформы Java , но я не буду слишком много объяснять о них. Цель этого поста не в том, как вы должны организовать проект, а в том, как заставить инструменты работать на вас. Вместо этого я напишу что-нибудь еще о JPMS в следующем посте (это довольно интригующе и запутанно).

Что такое JavaFX?

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

Пример

Давайте возьмем базовый пример JavaFX, например, этот:

https://gitlab.com/lucaguada/treefx .

Исходный код довольно старый и представляет собой пример JavaFX 2.1, взятый отсюда: Oracle Docs .

Я настроил pom.xml как можно проще, или, по крайней мере, таково было мое намерение. Я просто установил два плагина: maven-компилятор-плагин , чтобы избежать проблем с компиляцией, когда мы продвигаем версию Java во время наших тестов, и exec-maven-плагин для возможности запускать наше приложение с терминала.

Oracle Java SE чтобы открыть JDK

Как я уже упоминал ранее, JavaFX больше не является частью OpenJDK. Давайте посмотрим, прав ли такой бумер, как я.

Скачать tar.gz файл Oracle Java SE 1.8.0 отсюда: Oracle Java и не беспокойтесь о лицензии, в часто задаваемых вопросах это прямо указано:

Oracle Java SE8 updates, which includes the Oracle JRE with Java Web Start, continue to be free for personal use, development, testing, prototyping, demonstrating and some other important uses explained in this FAQ under the OTN License Agreement for Java SE. Personal users can continue downloading the Oracle Java SE 8 JRE at java.com.

Распакуйте пакет в папку .sdkman/кандидаты/java . Вы должны иметь возможность проверить Oracle JDK, набрав:

 $ sdk list java

Sdkman должен перечислить Oracle Java SE следующим образом:

Unclassified  |     | 8.0.281      | none    | local only | 8.0.281-oracle

Мило! Поэтому теперь мы можем скомпилировать наш проект:

 $ sdk use java 8.0.281-oracle
Using java version 8.0.281-oracle in this shell.
 $ mvn clean compile exec:java

и если все в порядке:

Приятно вдвойне! Однако мы не хотим, чтобы у нас болела голова из-за лицензий/подписок Oracle/и т. Д., Поэтому теперь мы меняем Oracle JDK на открытый и снова компилируем.

 $ sdk install java 8.0.272.hs-adpt
... install process by sdkman ...
 $ sdk use java 8.0.272.hs-adpt
Using java version 8.0.272.hs-adpt in this shell.
 $ mvn clean compile exec:java

и трагически:

[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR] 
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoFailureException

Ошибки, ошибки повсюду! Tree FX не может найти ни одного пакета фреймворка JavaFX! Как это решить? JavaFX теперь представляет собой набор автономных зависимостей, поэтому давайте изменим pom.xml файл путем определения правильных зависимостей.


  
    org.openjfx
    javafx-controls
    16
  
  
    org.openjfx
    javafx-media
    16
  

а затем снова скомпилируйте. Но… опять же…

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project treefx: Compilation failure
[ERROR] /home/.../treefx/src/main/java/io/trydent/treefx/Flower.java:[7,20] cannot access javafx.scene.Group
[ERROR]   bad class file: /home/.../.m2/repository/org/openjfx/javafx-graphics/16/javafx-graphics-16-linux.jar(javafx/scene/Group.class)
[ERROR]     class file has wrong version 55.0, should be 52.0
[ERROR]     Please remove or make sure it appears in the correct subdirectory of the classpath.

Больше никаких ошибок об отсутствующих пакетах, кроме версии файла класса! Что это значит? Каждый раз, когда компилятор Java компилирует ваш код, он помечает ваши классы номером, чтобы идентифицировать целевой выпуск JDK. В этом случае версия класса 55.0 предназначена для JDK11, но мы используем JDK 8, поэтому номер версии класса должен быть не более 52.0.

К сожалению, нет способа понизить JavaFX до версии, совместимой с JDK 8. Конечно, как мне уже кто-то предлагал, мы можем скачать Liberica OpenJDK 8 с JavaFX (или Azul) однако мы навсегда застрянем на JavaFX 8. Блокировка JavaFX 8 не позволяет нам извлекать выгоду из исправлений ошибок и других улучшений.

Пришло время обновить наш OpenJDK до 11.

Открытый JDK 11

Как только мы установим наши зависимости JavaFX в pom.xml , мы можем попробовать переключиться на OpenJDK 11:

 $ sdk use java 11.0.10.hs-adpt
Using java version 11.0.10.hs-adpt in this shell.
 $ mvn clean compile exec:java

И все будет хорошо. Больше никаких ошибок об отсутствующих пакетах и версиях классов.

Поскольку наше приложение готово, мы можем упаковать его в самоисполнимую банку и выпустить ее нашим клиентам/друзьям/домашним животным (ну, если они все заинтересованы в анимации деревьев, конечно). Поступая таким образом, мы сталкиваемся со старомодной проблемой: мы зависим от установленного JDK клиента/друга/питомца. Мы не можем обновить наш JDK для разработки (давайте подумаем о новых улучшениях API и среды выполнения и т.д.), Пока наши клиенты не обновят свои собственные. Да, мы могли бы упаковать приложение с помощью JRE, но это привело бы к получению довольно большого размера ZIP только для одной анимации.

Ссылка, компоновщик Java

Как объяснено в JEP 282, JLink – это инструмент, который может собирать модули и их зависимости в пользовательский образ среды выполнения Java. Поскольку JRE, JDK и некоторые библиотеки/фреймворки теперь реструктурированы в модули, мы можем создать пользовательский образ JRE из нашего замечательного приложения JavaFX!

JavaFX действительно модульный, так что мы можем попробовать!

Однако прежде чем начать, я должен сообщить вам, что я пропустил официальное Плагин Maven Link использование. В черновике этой статьи я объяснил, как работать с плагином Link и JavaFX, но я понял, что это слишком долго и не очень полезно на практике (по крайней мере, для этого примера). Вместо плагина Maven Link мы будем использовать официальный плагин JavaFX Jlink , предоставленный командой разработчиков JavaFX, для упрощения процесса.

Давайте изменим pom.xml и добавьте плагин Maven для JavaFX и JLINK :


  org.openjfx
  javafx-maven-plugin
  0.0.5
  
    2
    true
    true
    true
    treefx
    treefx/com.acme.treefx.TreeFX
    treefx
    treefx
  

Конфигурация не совсем понятна, вот некоторые подсказки:

  • сжатие включает сжатие ресурсов, мы установили значение 2 для сжатия в ZIP
  • нет файлов заголовков исключает файлы заголовков C для поддержки программирования на машинном коде (нам это не нужно для нашей пользовательской JRE)
  • отладка полосы исключает отладочную информацию JRE (да, нам это тоже не нужно)
  • нет справочных страниц исключает документы JDK
  • j Имя изображения ссылки окончательное имя среды выполнения
  • Имя jlinkzip/| окончательное имя почтового ИНДЕКСА пусковая установка
  • имя исполняемого файла основной класс
  • что мэн необходимо запустить, указав модуль, пакет и класс.

Мы устанавливаем все такие исключения для уменьшения нашего пользовательского JRE до меньшего размера, чем обычный. Однако, если мы попробуем новую команду плагина:

 $ mvn clean compile javafx:jlink

Чего-то все еще не хватает:

[ERROR] Failed to execute goal org.openjfx:javafx-maven-plugin:0.0.5:jlink (default-cli) on project treefx: Error: jlink requires a module descriptor

Как я уже говорил ранее, если JDK, JRE и JavaFX теперь являются модульными, это означает, что нам также необходимо модульизировать ваше приложение. Создайте новый файл с именем module-info.java в папке src/основной/java :

module treefx {
  requires javafx.controls;
  requires javafx.media;

  opens com.acme.treefx to javafx.graphics;
}

Файл определяет ваше приложение как модуль с именем tree fx , и нашему модулю также требуются некоторые модули для работы, javafx.элементы управления и javafx.media . Я не хочу слишком много объяснять об этом, но имейте в виду, что модули – это новый способ организации ваших приложений и библиотек и обеспечения надежной инкапсуляции и реализации/скрытия отражения . Зная это, как насчет последнего утверждения открывается в информация о модуле ? В некоторых случаях вам необходимо включить отражение (из-за модулей отражение недоступно по умолчанию) для ваших классов, например, из-за фреймворков. В нашем случае мы должны включить отражение нашего пакета com.acme.дерево fx в модуль javafx.графика

Затем еще раз:

 $ mvn clean compile javafx:jlink

…наконец-то…

[INFO] Building zip: /home/.../treefx/target/treefx.zip

Дааа, наше приложение готово к распространению, чтобы узнать здесь (город.)!

Давайте посмотрим, что на самом деле произошло в целевой папке:

 $ tree target/treefx
target/treefx
├── bin
│   ├── java
│   ├── keytool
│   └── treefx
├── conf
│   ├── [...]
├── legal
│   ├── [...]
├── lib
│   ├── [...]
└── release

Что мы имеем в сгенерированном treefx.zip ? Как мы видим, это просто JRE с нашим приложением, инкапсулированным внутри. В папке bin , мы можем найти пусковую установку |/дерево fx .

А размер ZIP-файла? Всего 47 Мб ! Лучшая часть? Если нашему приложению нужны только модули, которые мы объявили в module-info , размер увеличится только в том случае, если ваше приложение будет расти с точки зрения скомпилированных классов.

Хороший трюк, правда? Но мы хотим большего! Ради эстетики мы предпочитаем распространять наше приложение с официальным пакетом deb как мы можем это сделать?

Пришло время обновить наш OpenJDK до 16!

OpenJDK 16 и пакет

OpenJDK 16 был выпущен 16 марта. Тем не менее, это не тот пост, в котором рассказывается обо всех новых функциях и инструментах shining, но это правильный пост, в котором рассказывается о новом конкретном инструменте: Посылка .

Пакет был представлен в качестве инкубационного инструмента с JDK 14 по JDK 15 и теперь готов к производству для упаковки автономных приложений Java.

Как и выше, мы хотим полагаться на Maven, и, к счастью, у нас есть хорошо упакованный плагин ( Плагин пакета ) на Maven Central, который мы можем добавить:


  org.panteleyev
  jpackage-maven-plugin
  1.4.0
  
    TreeFX
    1.0.0
    com.acme
    target/dist
    treefx/com.acme.treefx.TreeFX
    target/treefx
    true
    treefx
    Utilities
    Utilities
    ${project.basedir}/duke.png
    
      
    
  

Я должен сказать несколько слов о конфигурации, потому что в некоторых моментах это немного сложно.

Легкая часть

  • имя задает имя приложения (вы не говорите!)
  • версия приложения как и любое другое приложение, у нашего Tree FX тоже есть релизная версия!
  • поставщик устанавливает поставщика или нашу компанию Acme
  • назначение задает папку назначения для созданного пакета

Сложная часть

  • модуль мы устанавливаем модуль и основной класс нашего приложения, так как JPackage создаст новый исполняемый файл для нашего пакета
  • runtimeImage обычно устанавливается для нашей разработки OpenJDK, потому что jpackge может работать с JLINK для создания пользовательской JRE, но из-за некоторых проблем, которые я обнаружил с JavaFX и JLINK (процесс непростой), мы обманываем JPackage и говорим ему использовать предыдущую пользовательскую JRE, созданную с помощью плагина OpenJFX

Часть Linux (Я сказал это просто для полноты картины)

  • ярлык linux создает ярлык после процесса установки приложения
  • имя пакета linux задает окончательное deb имя пакета
  • категория приложений Linux задает категорию приложений Linux
  • Группа меню Linux устанавливает группу меню Linux

Может быть, мне придется потратить больше слов на сложную часть . Как упоминалось выше, Package – это инструмент для упаковки автономного Java-приложения, любого вида Java-приложения, модульных и немодуляризованных приложений. Но для этого примера мы хотим распространить простую анимацию, и было бы довольно странно распространять целое изображение JRE ради одной анимации. Поэтому всегда думайте о том, что вам действительно нужно для вашего приложения, и пусть правильный инструмент работает для вас.

О части linux . Пакет позволяет упаковывать не только для Linux, но и для Windows и Mac OS. Однако для работы пакет зависит от операционной системы, поэтому вы не можете упаковать приложение Linux, если вы используете Windows или macOS, короче говоря, нет, кросс-компиляция не является вариантом. Мы постараемся упаковать наше приложение Tree FX для Windows в дополнение к этой статье (возможно, на следующей неделе).

Хватит болтать. Давайте посмотрим, как это работает:

 $ mvn clean compile javafx:jlink jpackage:jpackage

Подождите немного, а затем:

 $ ls target/dist/
treefx_1.0.0-1_amd64.deb

Хорошие четыре льда! Теперь у нас есть ваш пакет для AMD64 arch (да, это мое). Если нам все еще интересно, как организован пакет deb , мы можем его распаковать:

 $ dpkg-deb -R target/dist/treefx_1.0.0-1_amd64.deb target/unpacked
 $ tree target/unpacked
target/unpacked
├── DEBIAN
│   ├── control
│   ├── postinst
│   ├── postrm
│   ├── preinst
│   └── prerm
└── opt
    └── treefx
        ├── bin
        │   └── TreeFX
        ├── lib
        │   ├── app
        │   │   └── TreeFX.cfg
        │   ├── runtime
        │   │   ├── [...]
        │   ├── TreeFX.png
        │   └── treefx-TreeFX.desktop
        └── share
            └── doc
                └── copyright

Мы могли бы оптимизировать вещи и использовать другие конфигурации пакетов, но пока все идет хорошо (как сказано в старом альбоме и песне Брайана Адамса).

Выводы

Мы наконец-то дошли до конца этого урока, можно было бы сказать гораздо больше о JPMS, JLINK и JPackage, это действительно введение, чтобы пощекотать ваше любопытство, и, как вы можете видеть, мы все еще можем создавать хорошие вещи с помощью технологии JavaFX и Java.

Копаться в https://gitlab.com/lucaguada/treefx репозиторий и посмотрите на различные ветви, чтобы иметь более четкое представление о вышеуказанных шагах.

Увидимся, космический ковбой!

«Шанс начать все сначала в золотой стране возможностей и приключений!»

Оригинал: “https://dev.to/cherrychain/javafx-jlink-and-jpackage-h9”