JLink — это мощный инструмент, который был введён в Java 9 как часть модульной системы JPMS. Его основная задача — создание кастомизированных JDK, включающих только необходимые модули для работы конкретного приложения.

Благодаря исключению ненужных модулей, приложения, собранные с помощью JLink, становятся легче и быстрее загружаются. Это особенно важно для приложений, работающих в ограниченных средах, например, в микросервисной архитектуре или на встраиваемых устройствах. Меньший размер JRE снижает время старта и использование оперативной памяти, что критично в условиях ограниченных ресурсов.

Например, обычный JRE содержит десятки модулей, таких как java.sql или java.xml, которые могут быть не нужны конкретному приложению. Используя JLink, разработчик может создать минимальный набор модулей, достаточный для его проекта.

Основная команда JLink выглядит следующим образом:

jlink --module-path $JAVA_HOME/jmods --add-modules <список модулей> --output <путь_к_результирующей_JRE>
  • --module-path указывает путь к модульной системе JDK, которая по умолчанию находится в папке jmods в вашем JDK.
  • --add-modules определяет, какие модули будут включены в итоговую сборку JRE. Это могут быть как модули стандартной библиотеки (например, java.base), так и модули вашего приложения.
  • --output указывает папку, в которую будет выведена готовая сборка JRE.

Основные опции JLink

  • –-strip-debug. Удаляет символы отладки из итоговой сборки JRE. Это помогает дополнительно уменьшить размер JRE, особенно когда приложение не нуждается в отладочной информации.
  • --compress. отвечает за сжатие файлов в сборке JRE. Она поддерживает несколько уровней сжатия:
    • 0 — без сжатия (по умолчанию),
    • 1 — сжатие классов, но без применения дорогих методов сжатия,
    • 2 — максимальное сжатие, что снижает размер сборки, но может замедлить время загрузки.
  • -–strip-native-commands. Эта опция удаляет нативные команды (например, инструменты вроде jcmd, jmap, и другие утилиты), которые не нужны в большинстве рабочих окружений.
  • --launcher. Позволяет создавать собственные лаунчеры для вашего приложения. Это может быть полезно для упрощения запуска приложения конечными пользователями. Лаунчеры создаются в директории bin сгенерированной JRE. Пример --launcher myapp_launcher=myapp.module/com.example.Main
  • --bind-services. Полезна для автоматического связывания сервисов, если приложение использует ServiceLoader. Эта опция необходима, когда модульная система управляет загрузкой сервисов, и их нужно зарегистрировать для запуска приложения.
  • --target. Позволяет создавать JRE для других платформ (например, создавать сборку для Linux с машины на Windows). Пример --target linux-x64

JDeps анализирует зависимости приложения, автоматически определяя, какие модули используются, а JLink на основе этого анализа создаёт кастомную JRE

Пример совместного использования JDeps и JLink:

jlink --add-modules $(jdeps --multi-release 17 --ignore-missing-deps -q -recursive --print-module-deps -cp 'project-core/build/lib/boot/*':'project-core/build/lib/main/*':'project-core/build/app/*' project-core/build/app/*) --strip-debug --no-man-pages --no-header-files --compress=2 --output ./build/jdk

Мета информация

Область:: 00 Java разработка
Родитель::
Источник::
Создана:: 2024-10-15
Автор::

Дополнительные материалы

Дочерние заметки