Ръководство за jlink

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 Runtime изображения

Ще извършим поредица от прости стъпки за създаване на персонализирани 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 за изброяване на зависимите модули

За да използваме 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. Стартиране на приложение с генерираното изображение

Сега имаме наш JRE, създаден от jlink .

За да тестваме нашия JRE, нека се опитаме да стартираме нашия модул, като навигираме в папката bin на нашата директория customjre и изпълним командата по-долу:

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

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

4. Създаване на потребителски JRE със скриптове за стартиране

По желание можем да създадем и потребителски JRE с изпълними скриптове за стартиране .

For this, we need to run the jlink command that has an extra –launcher parameter to create our launcher with our module and main class:

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

This will generate two scripts: customjrelauncher.bat and customjrelauncher inside our customjre/bin directory.

Let's run the script:

customjrelauncher.bat

And the output will be:

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

5. Conclusion

In this tutorial, we have learned how we can create a custom, modular JRE with jlink that only contains the bare minimum files needed for our module. We also looked into how to create a custom JRE with launcher scripts that can be easily executed and shipped.

Персонализираните, модулни образи за изпълнение на Java са мощни. Целите за създаване на персонализирани JRE са ясни: те спестяват памет, подобряват производителността, а също така подобряват сигурността и поддръжката. Леките потребителски JRE също ни позволяват да създаваме мащабируеми приложения за малки устройства.

Кодовите фрагменти, използвани в този урок, са достъпни през Github.