1. Обзор
jlink это инструмент, который создает пользовательский образ среды выполнения Java, содержащий только модули платформы, необходимые для данного приложения.
Такой образ среды выполнения действует точно так же, как JRE, но содержит только выбранные нами модули и зависимости, необходимые для их функционирования. Концепция модульных образов среды выполнения была введена в JEP 220 .
В этом уроке мы узнаем, как создать пользовательскую JRE с помощью j link , а также запустим и проверим, правильно ли работает ваш модуль внутри нашей 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; }
Для запуска этой программы нам нужны только Hello World, | String , Logger и Object классы.
Несмотря на то, что для запуска этой программы требуется всего четыре класса, все предопределенные классы в JRE также выполняются, даже если наша программа их не требует.
Поэтому, чтобы запустить небольшую программу, мы должны поддерживать полную JRE, что является просто пустой тратой памяти.
Таким образом, настроенный JRE-лучший вариант для запуска нашего примера.
С jlink , , мы можем создать свою собственную небольшую банку, содержащую только соответствующие классы, которые мы хотим использовать, не тратя память, и в результате мы увидим повышение производительности.
3. Создание Пользовательских Образов Среды Выполнения Java
Мы выполним ряд простых шагов для создания пользовательских образов JRE.
3.1. Компиляция модуля
Во – первых, давайте скомпилируем упомянутую выше программу из командной строки:
javac -d out module-info.java
javac -d out --module-path out com\baeldung\jlink\HelloWorld.java
Теперь давайте запустим программу:
java --module-path out --module jlinkModule/com.baeldung.jlink.HelloWorld
Выход будет:
Mar 13, 2019 10:15:40 AM com.baeldung.jlink.HelloWorld main INFO: Hello World!
3.2. Использование jdep для перечисления зависимых модулей
Чтобы использовать 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
Теперь давайте создадим пользовательский 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. Запуск приложения с сгенерированным изображением
Теперь у нас есть наш пользовательский JAR, созданный j link .
Чтобы проверить ИЛИ, давайте попробуем запустить ваш модуль, перейдя в папку bin вашего каталога custom jre и выполнив команду ниже:
java --module jlinkModule/com.baeldung.jlink.HelloWorld
Опять же, оболочка Windows, которую мы используем, ищет в текущем каталоге любой исполняемый файл, прежде чем перейти к ПУТИ. Нам нужно обратить особое внимание на то, чтобы на самом деле запускать нашу пользовательскую JRE, а не java , разрешенную против ПУТИ, когда мы находимся на Linux или Mac.
4. Создание пользовательских JRE с помощью сценариев запуска
Опционально, мы также можем создать пользовательский JRE с исполняемым файлом launcher scripts .
Для этого нам нужно запустить команду jlink с параметром extra –launcher , чтобы создать наш лаунчер с нашим модулем и основным классом :
jlink --launcher customjrelauncher=jlinkModule/com.baeldung.jlink.HelloWorld --module-path "%JAVA_HOME%\jmods";out --add-modules jlinkModule --output customjre
Это приведет к созданию двух сценариев: custom jar launcher.bat и custom jre launcher внутри нашего каталога custom jre/bin .
Давайте запустим сценарий:
customjrelauncher.bat
И выход будет:
Mar 18, 2019 12:34:21 AM com.baeldung.jlink.HelloWorld main INFO: Hello World!
5. Заключение
В этом уроке мы узнали, как мы можем создать пользовательскую модульную банку с jlink , которая содержит только минимальные файлы, необходимые для нашего модуля. Мы также рассмотрели, как создать пользовательский JRE со сценариями запуска, которые можно легко выполнить и отправить.
Пользовательские, модульные образы среды выполнения Java являются мощными. Цели создания пользовательских банок ясны: они экономят память, повышают производительность, а также повышают безопасность и ремонтопригодность. Легкие пользовательские JRE также позволяют нам создавать масштабируемые приложения для небольших устройств.
Фрагменты кода, используемые в этом руководстве, доступны через Github .