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

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


Октябрь 22, 2021


Liberica 17 一 основа NIK 21.3

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

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

Содержание

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

Почему Liberica NIK?

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

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

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

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

Liberica JDK интегрирована в Spring Boot Native

Liberica JDK 一 среда исполнения, по умолчанию используемая в приложениях Spring (статья на английском языке), ввиду чего Liberica NIK является лучшим инструментом для создания нативных образов в Spring Boot.

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

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

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

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

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

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

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

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

Чтобы показать Liberica NIK в деле, мы преобразуем приложение Swing в нативный образ. В данном примере мы будем использовать демо-приложение Stylepad. Напоминаем, что вам понадобится сборка Liberica NIK на базе Liberica 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.

В текущую версию Liberica 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 и в сборках Liberica NIK на базе Liberica JDK 11;
  • градиенты и границы не прорисовываются надлежащим образом на JButton для Nimbus L&F. Используйте другие инструменты дизайна;
  • в приложениях, явно использующих класс SplashScreen, наблюдается сбой компоновщика нативного образа.

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

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

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

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

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

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

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

Сначала скачайте и установите nik-openjdk11-full-21.3 с сайта bell-sw.com.

Выполните команду

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 Время запуска
Liberica 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 год.

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

Опенсорсный подход к разработке ПО

Инженеры BellSoft, создавшие Liberica JDK и Liberica NIK, в своих разработках следуют опенсорсному подходу. Мы постоянно вносим изменения в основную ветвь OpenJDK. Мы также входим в консультативный совет GraalVM. Это делает нас экспертами в области технологии нативной компиляции. Наше ПО выбирают компании, которым важна стабильность и безопасность рантайма. Одной из таких компаний является VMware, которая выбрала Liberica JDK (статья на английском языке) в качестве полностью поддерживаемой технологии нативной компиляции для создания нативных образов в Spring Boot.

Заключение

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

Author image

Пётр Железняков

Старший Инженер BellSoft

BellSoft LTD [email protected] BellSoft LTD logo Liberica Committed to Freedom 199 Obvodnogo Kanala Emb. 190020 St. Petersburg RU +7 812-336-35-67 BellSoft LTD 199 Obvodnogo Kanala Emb. 190020 St. Petersburg RU +7 812-336-35-67 BellSoft LTD 111 North Market Street, Suite 300 CA 95113 San Jose US +1 702 213-59-59