Новая версия NIK 21.3 с поддержкой AWT и OpenJFX

Новая версия Axiom Native Image Kit 21.3 на базе Axiom 17 и 11 доступна для скачивания!


Октябрь 22, 2021


Axiom 17 一 основа NIK 21.3

Новый LTS-релиз Axiom JDK 一 это событие, которое по цепной реакции запускает релизы других наших продуктов. Представляем вам последнюю версию Axiom NIK, инструмента на базе GraalVM, который ускоряет ваши приложения благодаря технологии нативной компиляции.

Он основан на Axiom JDK 17 или Axiom JDK 11, двух последних LTS-версиях.

Содержание

  1. Почему Axiom NIK?
    1. Новая версия GraalVM в Axiom NIK
    2. Axiom JDK интегрирована в Spring Boot Native
  2. Улучшенная поддержка десктопных приложений
    1. Образец проекта на Axiom NIK + AWT/Swing
    2. Образец проекта на Axiom NIK + OpenJFX
  3. Опенсорсный подход к разработке ПО
  4. Заключение

Почему Axiom NIK?

Мы можем привести множество причин, по которым стоит выбрать Axiom NIK в качестве генератора нативных образов!

Новая версия GraalVM в Axiom NIK

Виртуальная машина GraalVM в сердце Axiom NIK также была обновлена до последней версии, которая включает много новых функций:

  • Базовая поддержка модульной системы Java. Поддерживаются опции “--module”, “--module-path”, “--add-exports” и “--add-opens”. Они работают так же, как в программе запуска Java, позволяя компилировать приложения, состоящие из нескольких модулей;
  • Теперь можно выполнить конфигурацию записей конфигурационных файлов Reflection и JNI, которые будут применяться только в случае, если конкретный класс будет доступен во время анализа. Данная функция помогает создавать маленькие и быстрые нативные образы;
  • Новая «‎адаптивная» политика сборки мусора помогает сократить потребление памяти и повысить производительность сборщика мусора. Теперь она используется по умолчанию. Предыдущую политику «BySpaceAndTime» можно использовать, введя -H:InitialCollectionPolicy в командной строке;
  • Генератор нативных образов теперь может считывать аргументы командной строки из файла, используя синтаксис «‎@file» по примеру javac.

Улучшенная поддержка десктопных приложений

Новый релиз включает улучшенную поддержку десктопных приложений. Представляем новую Full версию Axiom NIK, включающую OpenJFX.

Axiom NIK теперь работает с фреймворком AWT/Swing (сборки Axiom NIK версии core, standard и full для Linux на базе Axiom JDK 11) и OpenJFX (только сборки версии full для Linux и Windows на базе Axiom JDK 11 и 17).

Перечень платформ, поддерживаемых Axiom NIK 21.3

База Axiom JDK для Axiom NIK + ОС & CPU Поддержка приложений без графического интерфейса AWT/Swing OpenJFX (только в сборках версии full)
Axiom JDK 11 + Windows x86 + - +
Axiom JDK 11 + Linux x86 + + +
Axiom JDK 11 + Linux ARM + - -
Axiom JDK 11 + Alpine Linux x86 + - -
Axiom JDK 11 + Alpine Linux ARM + - -
Axiom JDK 11+ macOS x86 + - -
Axiom JDK 17 + Windows x86 + - +
Axiom JDK 17+ Linux x86 + - +
Axiom JDK 17 + Linux ARM + - -
Axiom JDK 17 + Alpine Linux x86 + - -
Axiom JDK 17 + Alpine Linux ARM + - -
Axiom JDK 17+ macOS x86 + - -

В будущих релизах Axiom NIK мы планируем добавить поддержку AWT/Swing для Windows и Mac и OpenJFX для Mac.

Примечание: полная поддержка OpenJFX уже реализована в сборках Axiom JDK 8, 11, 17 версии full.

Образец проекта на Axiom NIK + AWT/Swing

Чтобы показать Axiom NIK в деле, мы преобразуем приложение Swing в нативный образ. В данном примере мы будем использовать демо-приложение Stylepad. Напоминаем, что вам понадобится сборка Axiom NIK на базе Axiom JDK 11!

Перед началом работы

Чтобы создать нативный образ для приложения Swing, нужно учесть следующее:

  • Grall по умолчанию устанавливает свойство java.awt.headless как true. Не забудьте установить java.awt.headless как false при создании нативного образа для приложений Swing;
  • Явно укажите инструменту для создания нативных образов на ресурсы, используемые приложением, такие как файлы свойств и изображения;
  • То же самое проделайте с классами, используемыми в приложении в рамках рефлексии или сериализации: явно укажите на них инструменту для создания нативных образов.

Готовим проект

Стоит отметить, что в приложении Stylepad JDK используется сериализация. Запустите демо-приложение Stylepad с помощью трассировочного агента Graal для дампа сериализуемых классов, используемых в приложении:

java -agentlib:native-image-agent=config-output-dir=conf-dir -jar Stylepad.jar

Установите java.awt.headless как false. Затем укажите ресурсные файлы *.properties, *.gif и конфигурационный файл сериализации:

native-image -Djava.awt.headless=false '-H:IncludeResources=.*/(Notepad|Stylepad).*properties$' '-H:IncludeResources=.*/.*gif$' -H:SerializationConfigurationFiles=conf-dir/serialization-config.json -jar Stylepad.jar

alt_text

Изображение взято из нативно скомпилированного демо-приложения Stylepad

Создаем нативный образ

Запустите демо-приложении Stylepad с помощью трассировочного агента Graal для дампа ресурсов и рефлексных классов, используемых в приложении:

java -agentlib:native-image-agent=config-output-dir=conf-dir -jar Stylepad.jar

Запустите инструмент для создания нативных образов с указанием ресурсных файлов и конфигурационного файла рефлексии, которые вы только что сгенерировали:

native-image -Djava.awt.headless=false -H:ResourceConfigurationFiles=conf-dir/resource-config.json -H:ReflectionConfigurationFiles=conf-dir/reflect-config.json -jar Stylepad.jar

Обсуждение

Примечание: чтобы компиляция NIK AOT работала с источниками проекта, нам потребовалось трассировать и обновить проект, добавив

  • классы, используемые в рамках рефлексии (Toolkit, FontManager, L&F, KeyEvent);
  • ресурсы, используемые L&F.

В текущую версию Axiom NIK были добавлены классы Swing, используемые в рамках рефлексии или JNI. Они были получены с помощью трассирующего агента и внедрены в несколько приложений Swing.

Однако некоторые функции рефлексии или JNI, возможно, отсутствуют. Для решения этой проблемы запустите трассирующий агент и вручную добавьте отсутствующие классы.

Результаты в числах

Сравнение размеров

jdeps --list-deps Stylepad.jar
java.base
java.desktop
java.logging

jlink --no-header-files --no-man-pages --compress=2 --strip-debug --add-modules java.desktop,java.logging --output jdk-desktop

Размер jdk-desktop: 71MB

Размер Stylepad.jar: 106kB

Размер jdk-desktop + Stylepad.jar: 71.1MB

Размер нативного образа Stylepad: 64MB

alt_text

Сравнение размеров приложений Stylepad, упакованных разными способами

Запуск демо-версии Stylepad через jar-файл:

time -v jdk-desktop/bin/java -jar Stylepad.jar
    User time (seconds): 1.89
    System time (seconds): 0.09
    Percent of CPU this job got: 17%
    Maximum resident set size (kbytes): 72192

Запуск нативного образа Stylepad:

time -v ./Stylepad
    User time (seconds): 0.10
    System time (seconds): 0.05
    Percent of CPU this job got: 1%
    Maximum resident set size (kbytes): 71760

Известные ограничения

  • AWT/Swing на данный момент поддерживается только на ОС Linux и в сборках Axiom NIK на базе Axiom JDK 11;
  • градиенты и границы не прорисовываются надлежащим образом на JButton для Nimbus L&F. Используйте другие инструменты дизайна;
  • в приложениях, явно использующих класс SplashScreen, наблюдается сбой компоновщика нативного образа.

Планы на будущее

В следующих релизах мы планируем

  • добавить поддержку AWT/Swing для Windows и macOS;
  • устранить ошибки в приложениях, использующих экран-заставку.

Образец проекта на Axiom NIK + OpenJFX

В нашем следующем примере мы будем использовать OpenJFX для сборки нативного образа игры «Brick Breaker».

Это решение подходит для обеих сборок Axiom NIK (на базе Axiom JDK 11 или 17) и обеих поддерживаемых ОС: Windows и Linux.

Создаем нативный образ

После установки Axiom NIK выполните команду

native-image -H:IncludeResources='ensemble.samples.shared-resources.brickImages.*' -jar BrickBreaker.jar brickbreaker

Чтобы включить в нативный образ необходимые ресурсы (изображения, звуки или XML-файлы), выполните

-H:IncludeResources='com.fxapp.package.resources.*'

Дополнительные варианты применения описаны в документации GraalVM (на английском языке).

Дождитесь завершения процесса.

Выполните ./brickbreaker

alt_text

Изображение взято из нативно скомпилированного демо-приложения BrickBreaker OpenJFX

Обсуждение

Показатели производительности

Размер RSS Время запуска
Axiom 11.0.13-full + BrickBreaker.jar 517M 587M 360ms
Пользовательский образ (jlink --add-modules javafx.graphics) + BrickBreaker.jar 122M 422M 360ms
Нативный образ 33M 384M 270ms

Ограничения и как их преодолеть

  • на данный момент доступно только для Windows и Linux x64;
  • модули javafx.media и javafx.web пока не поддерживаются;
  • доступ к классам/методам/полям (включая JNI) с помощью рефлексии необходимо сконфигурировать перед запуском команды native-image. Мы обрабатываем рефлективные вызовы библиотек OpenJFX за вас, но вам все равно нужно правильно сконфигурировать вызовы, выполняемые в вашем приложении.

Планы на будущее

Поддержка macOS запланирована на 2022 год.

Если у вас остались вопросы, забронируйте бесплатную консультацию!

Заключение

Новая версия Axiom NIK v21.3 一 это надежная и проверенная технология для создания нативных образов в Spring. А теперь с ее помощью можно собирать нативные образы на десктопах. Благодаря Axiom JDK десктопные приложения на Linux и Windows станут еще стабильнее и безопаснее. Axiom JDK продолжит совершенствовать технологию NIK и добавлять новые функции и поддерживаемые платформы.

Author image

Олег Чирухин

Директор по коммуникациям с разработчиками (DevRel)

Axiom JDK info@axiomjdk.ru Axiom JDK logo Axiom Committed to Freedom 199 Obvodnogo Kanala Emb. 190020 St. Petersburg RU +7 812-336-35-67 Axiom JDK 199 Obvodnogo Kanala Emb. 190020 St. Petersburg RU +7 812-336-35-67