«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\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. Использование jdeps для получения списка зависимых модулей

jdeps --module-path out -s --module jlinkModule

Чтобы использовать jlink, нам нужно знать список модулей JDK, которые использует приложение и которые мы должны включить в нашу пользовательскую JRE.

jlinkModule -> java.base
jlinkModule -> java.logging

Давайте воспользуемся командой jdeps для получения зависимых модулей, используемых в приложении:

Вывод будет таким:

Это имеет смысл, так как java.base — это минимальный модуль, необходимый для Java. библиотеки кода, а java.logging используется регистратором в нашей программе.

jlink [options] –module-path modulepath
  –add-modules module [, module…]
  --output <target-directory>

3.3. Создание пользовательской JRE с помощью jlink

jlink --module-path "%JAVA_HOME%\jmods";out
  --add-modules jlinkModule
  --output customjre

Чтобы создать пользовательскую JRE для модульного приложения, мы можем использовать команду jlink. Вот его основной синтаксис:

Теперь давайте создадим собственную JRE для нашей программы, используя Java 11:

Здесь значение после параметра add-modules указывает jlink, какой модуль включить. в JRE.

Наконец, customjre рядом с параметром –output определяет целевой каталог, в котором должна быть сгенерирована наша пользовательская JRE.

Обратите внимание, что мы используем оболочку Windows для выполнения всех команд в этом руководстве. Пользователям Linux и Mac, возможно, придется немного изменить их.

3.4. Запуск приложения с помощью сгенерированного образа

java --module jlinkModule/com.baeldung.jlink.HelloWorld

Теперь у нас есть наша пользовательская JRE, созданная jlink.

Чтобы протестировать нашу JRE, давайте попробуем запустить наш модуль, перейдя в папку bin нашего каталога customjre и выполнив следующую команду:

Опять же, оболочка Windows, которую мы используем, просматривает текущий каталог для любого исполняемого файла, прежде чем перейти к PATH. Нам нужно уделить особое внимание тому, чтобы фактически запустить нашу пользовательскую JRE, а не java, разрешенную с помощью PATH, когда мы работаем на Linux или Mac.

4. Создание пользовательской JRE со сценариями запуска

jlink --launcher customjrelauncher=jlinkModule/com.baeldung.jlink.HelloWorld
  --module-path "%JAVA_HOME%\jmods";out
  --add-modules jlinkModule
  --output customjre

При желании мы также можем создать пользовательскую JRE с исполняемыми сценариями запуска.

Для этого нам нужно запустить команду jlink с дополнительным параметром –launcher, чтобы создать нашу программу запуска с нашим модулем и основным классом:

customjrelauncher.bat

Это сгенерирует два скрипта: customjrelauncher.bat и customjrelauncher. внутри нашего каталога customjre/bin.

Mar 18, 2019 12:34:21 AM com.baeldung.jlink.HelloWorld main
INFO: Hello World!

Запустим скрипт:

И на выходе будет:

5. Заключение

«В этом руководстве мы узнали, как мы можем создать пользовательскую модульную JRE с jlink, которая содержит только минимальный минимум файлов, необходимых для нашего модуля. Мы также рассмотрели, как создать пользовательскую JRE со сценариями запуска, которые можно легко выполнить и отправить.