Anleitung zu jlink

1. Übersicht

jlink ist ein Tool, das ein benutzerdefiniertes Java-Laufzeitabbild generiert, das nur die Plattformmodule enthält, die für eine bestimmte Anwendung erforderlich sind.

Ein solches Laufzeitimage verhält sich genau wie die JRE, enthält jedoch nur die von uns ausgewählten Module und die Abhängigkeiten, die sie zum Funktionieren benötigen. Das Konzept der modularen Laufzeitbilder wurde in JEP 220 eingeführt.

In diesem Tutorial erfahren Sie, wie Sie mit jlink eine benutzerdefinierte JRE erstellen . Außerdem führen wir aus und testen, ob unser Modul in unserer JRE ordnungsgemäß funktioniert.

2. Sie müssen eine benutzerdefinierte JRE erstellen

Lassen Sie uns die Motivation hinter benutzerdefinierten Laufzeitbildern anhand eines Beispiels verstehen.

Wir erstellen eine einfache modulare Anwendung. Weitere Informationen zum Erstellen modularer Anwendungen finden Sie in unserem Artikel zur Modularität.

Erstellen wir zunächst eine HelloWorld- Klasse und ein entsprechendes Modul:

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; }

Zum Ausführen dieses Programms benötigen wir nur die Klassen HelloWorld, String , Logger und Object .

Obwohl für die Ausführung dieses Programms nur vier Klassen erforderlich sind, werden alle vordefinierten Klassen in der JRE ebenfalls ausgeführt, auch wenn unser Programm sie nicht benötigt.

Um ein kleines Programm auszuführen, müssen wir daher eine vollständige JRE verwalten, was einfach eine Verschwendung von Speicher ist.

Eine angepasste JRE ist daher die beste Option, um unser Beispiel auszuführen.

Mit jlink können wir unsere eigene kleine JRE erstellen, die nur die relevanten Klassen enthält, die wir verwenden möchten, ohne Speicherplatz zu verschwenden. Infolgedessen werden wir eine höhere Leistung feststellen .

3. Erstellen von benutzerdefinierten Java-Laufzeitbildern

Wir führen eine Reihe einfacher Schritte aus, um benutzerdefinierte JRE-Bilder zu erstellen.

3.1. Modul kompilieren

Lassen Sie uns zunächst das oben erwähnte Programm über die Befehlszeile kompilieren:

javac -d out module-info.java
javac -d out --module-path out com\baeldung\jlink\HelloWorld.java

Lassen Sie uns nun das Programm ausführen:

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

Die Ausgabe wird sein:

Mar 13, 2019 10:15:40 AM com.baeldung.jlink.HelloWorld main INFO: Hello World!

3.2. Verwenden von jdeps zum Auflisten der abhängigen Module

Um jlink verwenden zu können , müssen wir die Liste der JDK-Module kennen, die von der Anwendung verwendet werden und die wir in unsere benutzerdefinierte JRE aufnehmen sollten.

Verwenden Sie den Befehl jdeps , um die in der Anwendung verwendeten abhängigen Module abzurufen :

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

Die Ausgabe wird sein:

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

Dies ist sinnvoll, da java.base das für Java- Codebibliotheken erforderliche Mindestmodul ist und java.logging von einem Logger in unserem Programm verwendet wird.

3.3. Erstellen einer benutzerdefinierten JRE mit jlink

Um eine benutzerdefinierte JRE für eine modulbasierte Anwendung zu erstellen, können Sie den Befehl jlink verwenden . Hier ist die grundlegende Syntax:

jlink [options] –module-path modulepath –add-modules module [, module…] --output 

Jetzt erstellen wir eine benutzerdefinierte JRE für unser Programm mit Java 11:

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

Hier teilt der Wert nach dem Parameter –add-modules jlink mit, welches Modul in die JRE aufgenommen werden soll.

Schließlich definiert der Benutzer customjre neben dem Parameter –output das Zielverzeichnis, in dem unsere benutzerdefinierte JRE generiert werden soll.

Beachten Sie, dass wir die Windows-Shell verwenden, um alle Befehle in diesem Lernprogramm auszuführen. Linux- und Mac-Benutzer müssen sie möglicherweise leicht anpassen.

3.4. Ausführen einer Anwendung mit dem generierten Image

Jetzt haben wir unsere benutzerdefinierte JRE von jlink erstellt .

Um unsere JRE zu testen, versuchen wir, unser Modul auszuführen, indem wir im bin- Ordner unseres benutzerdefinierten Verzeichnisses navigieren und den folgenden Befehl ausführen:

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

Auch hier sucht die von uns verwendete Windows-Shell im aktuellen Verzeichnis nach ausführbaren Dateien, bevor Sie mit PATH fortfahren. Wir müssen besonders darauf achten, dass unsere benutzerdefinierte JRE tatsächlich ausgeführt wird, und nicht, dass Java unter Linux oder Mac gegen einen PATH aufgelöst wird.

4. Erstellen einer benutzerdefinierten JRE mit Launcher-Skripten

Optional können wir auch eine benutzerdefinierte JRE mit ausführbaren Launcher- Skripten erstellen .

Dazu müssen wir den Befehl jlink ausführen , der einen zusätzlichen Parameter –launcher enthält , um unseren Launcher mit unserem Modul und unserer Hauptklasse zu erstellen :

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

Dadurch werden zwei Skripte generiert: customjrelauncher.bat und customjrelauncher in unserem Verzeichnis customjre / bin .

Lassen Sie uns das Skript ausführen:

customjrelauncher.bat

Und die Ausgabe wird sein:

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

5. Schlussfolgerung

In diesem Tutorial haben wir gelernt, wie wir eine benutzerdefinierte, modulare JRE mit jlink erstellen können, die nur die für unser Modul erforderlichen Mindestdateien enthält. Wir haben uns auch mit der Erstellung einer benutzerdefinierten JRE mit Launcher-Skripten befasst, die einfach ausgeführt und versendet werden können.

Benutzerdefinierte, modulare Java-Laufzeitabbilder sind leistungsstark. Die Ziele für die Erstellung benutzerdefinierter JREs liegen auf der Hand: Sie sparen Speicherplatz, verbessern die Leistung sowie die Sicherheit und Wartbarkeit. Leichte benutzerdefinierte JREs ermöglichen es uns auch, skalierbare Anwendungen für kleine Geräte zu erstellen.

Die in diesem Tutorial verwendeten Codefragmente sind über Github verfügbar.