1. Обзор
jlink
— это инструмент, который создает собственный образ среды выполнения Java, содержащий только модули платформы, необходимые для данного приложения.
Такой образ среды выполнения действует точно так же, как JRE, но содержит только выбранные нами модули и зависимости, необходимые для их функционирования. Концепция модульных образов времени выполнения была представлена в JEP 220 .
В этом руководстве мы узнаем, как создать пользовательскую JRE с помощью jlink
, а также запустим и проверим, правильно ли работает наш модуль внутри нашей JRE.
2. Необходимо создать пользовательскую JRE
Давайте разберемся с мотивацией пользовательских образов среды выполнения на примере.
Мы создадим простое модульное приложение. Чтобы узнать больше о создании модульных приложений, обратитесь к нашей статье о модульности.
Во-первых, давайте создадим класс HelloWorld
и соответствующий модуль:
public class HelloWorld {
private static final Logger LOG = Logger.getLogger(HelloWorld.class.getName());
public static void main(String[] args) {
LOG.info("Hello World!");
}
}
module jlinkModule {
requires java.logging;
}
Для запуска этой программы нам нужны только классы HelloWorld,
String
, Logger
и Object .
Несмотря на то, что для запуска этой программе требуется всего четыре класса, все предопределенные классы в JRE также выполняются, даже если наша программа не требует их.
Следовательно, чтобы запустить небольшую программу, мы должны поддерживать полноценную JRE, а это просто пустая трата памяти.
Таким образом, настроенная JRE — лучший вариант для запуска нашего примера.
С помощью jlink
мы можем создать собственную маленькую JRE, содержащую только нужные классы, которые мы хотим использовать, не тратя впустую память, и в результате мы увидим повышенную производительность.
3. Создание пользовательских образов среды выполнения Java
Мы выполним ряд простых шагов для создания пользовательских образов JRE.
3.1. Компиляция модуля
Для начала скомпилируем упомянутую выше программу из командной строки:
javac -d out module-info.java
javac -d out --module-path out com\foreach\jlink\HelloWorld.java
Теперь запустим программу:
java --module-path out --module jlinkModule/com.foreach.jlink.HelloWorld
Вывод будет:
Mar 13, 2019 10:15:40 AM com.foreach.jlink.HelloWorld main
INFO: Hello World!
3.2. Использование jdeps
для получения списка зависимых модулей
Чтобы использовать jlink
, нам нужно знать список модулей JDK, которые использует приложение и которые мы должны включить в нашу пользовательскую JRE.
Давайте воспользуемся командой jdeps ,
чтобы получить зависимые модули, используемые в приложении:
jdeps --module-path out -s --module jlinkModule
Вывод будет:
jlinkModule -> java.base
jlinkModule -> java.logging
Это имеет смысл, так как java.base
— это минимальный модуль, необходимый для библиотек кода Java, а java.logging
используется регистратором в нашей программе.
3.3. Создание пользовательской JRE с помощью jlink
Чтобы создать пользовательскую JRE для модульного приложения, мы можем использовать команду jlink
. Вот его основной синтаксис:
jlink [options] –module-path modulepath
–add-modules module [, module…]
--output <target-directory>
Теперь давайте создадим собственную JRE для нашей программы, используя Java 11:
jlink --module-path "%JAVA_HOME%\jmods";out
--add-modules jlinkModule
--output customjre
Здесь значение после параметра –add-modules
сообщает jlink
, какой модуль включить в JRE.
Наконец, customjre
рядом с параметром –output
определяет целевой каталог, в котором должна быть создана наша пользовательская JRE.
Обратите внимание, что мы используем оболочку Windows для выполнения всех команд в этом руководстве. Пользователям Linux и Mac, возможно, придется немного изменить их.
3.4. Запуск приложения со сгенерированным образом
Теперь у нас есть наша пользовательская JRE, созданная jlink
.
Чтобы протестировать нашу JRE, давайте попробуем запустить наш модуль, перейдя в папку bin
нашего каталога customjre
и выполнив следующую команду:
java --module jlinkModule/com.foreach.jlink.HelloWorld
Опять же, оболочка Windows, которую мы используем, ищет в текущем каталоге любой исполняемый файл, прежде чем перейти к PATH. Нам нужно уделить особое внимание тому, чтобы фактически запустить нашу пользовательскую JRE, а не java
, разрешенную с помощью PATH, когда мы работаем на Linux или Mac.
4. Создание пользовательской JRE с помощью сценариев запуска
При желании мы также можем создать пользовательскую JRE с исполняемыми сценариями запуска
.
Для этого нам нужно запустить команду jlink
с дополнительным параметром –launcher
, чтобы создать нашу программу запуска с нашим модулем и основным классом :
jlink --launcher customjrelauncher=jlinkModule/com.foreach.jlink.HelloWorld
--module-path "%JAVA_HOME%\jmods";out
--add-modules jlinkModule
--output customjre
Это сгенерирует два скрипта: customjrelauncher.bat
и customjrelauncher
внутри нашего каталога customjre/bin
.
Запустим скрипт:
customjrelauncher.bat
И вывод будет:
Mar 18, 2019 12:34:21 AM com.foreach.jlink.HelloWorld main
INFO: Hello World!
5. Вывод
В этом руководстве мы узнали, как мы можем создать пользовательскую модульную JRE с jlink
, которая содержит только минимальный минимум файлов, необходимых для нашего модуля. Мы также рассмотрели, как создать пользовательскую JRE со сценариями запуска, которые можно легко выполнить и отправить.
Пользовательские модульные образы среды выполнения Java обладают мощными возможностями. Цели создания пользовательских JRE ясны: они экономят память, повышают производительность, а также повышают безопасность и удобство сопровождения. Облегченные пользовательские JRE также позволяют нам создавать масштабируемые приложения для небольших устройств.
Фрагменты кода, использованные в этом руководстве, доступны на Github .