БЛОГ AXIOM JDK
Загрузка...

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

Последняя версия NIK 21.3 включает улучшенную поддержку десктопных приложений и подходит для создания нативных образов с помощью фреймворков AWT/Swing и OpenJFX

7 мин чтения
alt_text

Октябрь 22, 2021


Axiom 17 一 основа NIK 21.3

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

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

Содержание

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

Почему 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

<table class="bs-u-table bs-u-width-15-col-2 bs-u-width-15-col-3 bs-u-width-15-col-4"> <thead> <tr> <th>База Axiom JDK для Axiom NIK + ОС & CPU </th> <th>Поддержка приложений без графического интерфейса </th> <th>AWT/Swing </th> <th>OpenJFX (только в сборках версии full) </th> </tr> </thead> <tbody> <tr> <td>Axiom JDK 11 + Windows x86 </td> <td>+ </td> <td>- </td> <td>+ </td> </tr> <tr> <td>Axiom JDK 11 + Linux x86 </td> <td>+ </td> <td>+ </td> <td>+ </td> </tr> <tr> <td>Axiom JDK 11 + Linux ARM </td> <td>+ </td> <td>- </td> <td>- </td> </tr> <tr> <td>Axiom JDK 11 + Alpine Linux x86 </td> <td>+ </td> <td>- </td> <td>- </td> </tr> <tr> <td>Axiom JDK 11 + Alpine Linux ARM </td> <td>+ </td> <td>- </td> <td>- </td> </tr> <tr> <td>Axiom JDK 11+ macOS x86 </td> <td>+ </td> <td>- </td> <td>- </td> </tr> <tr> <td>Axiom JDK 17 + Windows x86 </td> <td>+ </td> <td>- </td> <td>+ </td> </tr> <tr> <td>Axiom JDK 17+ Linux x86 </td> <td>+ </td> <td>- </td> <td>+ </td> </tr> <tr> <td>Axiom JDK 17 + Linux ARM </td> <td>+ </td> <td>- </td> <td>- </td> </tr> <tr> <td>Axiom JDK 17 + Alpine Linux x86 </td> <td>+ </td> <td>- </td> <td>- </td> </tr> <tr> <td>Axiom JDK 17 + Alpine Linux ARM </td> <td>+ </td> <td>- </td> <td>- </td> </tr> <tr> <td>Axiom JDK 17+ macOS x86 </td> <td>+ </td> <td>- </td> <td>- </td> </tr> </tbody> </table>

В будущих релизах 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

<p><img src="/assets/images/2021-10-22-the-new-axiom-native-image-kit-21-3-based-on-axiom-17-and-11-is-out/2.png" alt="alt_text"></p>

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

Запустите демо-приложении 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&amp;F, KeyEvent);
  • ресурсы, используемые L&amp;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 через 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&amp;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

Обсуждение

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

<table class="bs-u-table"> <thead> <tr> <th> </th> <th>Размер </th> <th>RSS </th> <th>Время запуска </th> </tr> </thead> <tbody> <tr> <td>Axiom 11.0.13-full + BrickBreaker.jar </td> <td>517M </td> <td>587M </td> <td>360ms </td> </tr> <tr> <td> Пользовательский образ (<code>jlink --add-modules javafx.graphics</code>) + BrickBreaker.jar </td> <td>122M </td> <td>422M </td> <td>360ms </td> </tr> <tr> <td>Нативный образ </td> <td>33M </td> <td>384M </td> <td>270ms </td> </tr> </tbody> </table>

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

  • на данный момент доступно только для 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 и добавлять новые функции и поддерживаемые платформы.

Сергей Лунегов

Сергей Лунегов

Директор по продуктам Axiom JDK