© Excellent backgrounds/Shutterstock.com
Teil 2: Erstellen von modularen Laufzeit-Images mit jlink

Nur das, was wir wirklich brauchen


Während des Softwareentwicklungsprozesses begegnen wir verschiedenen Situationen, in denen wir ein kundenspezifisches Java Runtime Environment (JRE) für unser Betriebssystem benötigen. Die Gründe dafür sind unterschiedlich: Vielleicht wollen wir eine bessere Leistung erzielen oder haben einige kundenspezifische Bibliotheken, die nur mit einem bestimmten Betriebssystem funktionieren. jlink hilft uns, diese Probleme zu lösen, indem wir mit seiner Hilfe eine benutzerdefinierte Version vom JRE erstellen können, die maßgeschneidert auf unser Betriebssystem ist und nur die Module enthält, die wir wirklich benötigen.

Java 9 stellt ein neues Werkzeug für die dynamische Verknüpfung von Modulen vor: jlink. Es hat die Aufgabe, eine Gruppe von Modulen zusammenzubauen, um dadurch ein Laufzeit-Image zu erzeugen. Um jlink zu verwenden, sind keine Änderungen im Quellcode erforderlich. jlink stellt in einem maßgeschneiderten Laufzeit-Image die Module zusammen. Es ändert die module-info.class-Dateien nicht. jlink startet mit den Modulen, die wir angeben, anschließend sucht es rekursiv nach allen requires-Anweisungen innerhalb der Deskriptoren der angegebenen Module. Ein Laufzeit-Image, das von jlink erzeugt wurde, enthält die minimale Anzahl der benötigten Module zusammen mit all ihren Abhängigkeiten. Während des Baus des Laufzeit-Images sind wir in der Lage, genau zu spezifizieren, welche Module dem Laufzeitbild hinzugefügt werden sollen. Als Ergebnis wird eine plattformspezifische, binäre, ausführbare Datei erstellt.

Das jlink-Werkzeug führt den Auflösungsprozess aus, um die für die Erzeugung des Laufzeit-Images erforderlichen Module zu berechnen. Das minimale Laufzeit-Image, das wir hypothetisch mit jlink erzeugen können, ist ein Laufzeit-Image, das nur das Hauptmodul java.base enthält. Basierend auf der Art der Plattformmodule erkennt jlink, welche die Zielplattform ist. Wenn wir beispielsweise ein Linux-Betriebssystem haben und einen Modulpfad an ein Windows-System weitergeben, wird jlink die Windows-Versionen dieser Module verknüpfen und ein Windows-Laufzeit-Image erzeugen. Es ist wichtig zu wissen, dass der Modulpfad, den wir jlink angeben, das Modul für die Zielplattform sein muss.

Die jlink-Images sind für jedes Betriebssystem spezifisch und sind eine Anpassung des JDKs und der JRE. Ein jlink-Image enthält die Verzeichnisse bin, conf, include, legal, lib und release. Für eine Anwendung, die nur das Modul java.base verwendet, wird ein maßgeschneidertes Laufzeit-Image erzeugt, das nur aus unseren Applikationsmodulen und aus dem java.base-Modul besteht.

jlinks allgemeine Syntax

Um ein Laufzeit-Image mit jlink zu erstellen, wird der jlink-Befehl zusammen mit den notwendigen Optionen ausgeführt. Abbildung 1 zeigt die Syntax des jlink-Befehls zusammen mit den wichtigsten Optionen:

jecan_java9_1.tif_fmt1.jpgAbb. 1: Syntax des jlink-Befehls
  • Die Option [jlink Optionen] spezifiziert Optionen, die durch Leerzeichen getrennt sind.

  • Die Option --module-path gibt an, wo sich die Module befinden, die von jlink entdeckt werden sollen. Folgende Formate können im Modulpfad enthalten sein: expandierte Module, modulare JAR-Dateien oder JMOD-Dateien.

  • Die Option --add-modules gibt die Namen der Module an, die zum Laufzeit-Image hinzugefügt werden sollen. Die angegebenen Module werden zum Laufzeit-Image zusammen mit ihren transitiven Abhängigkeiten hinzugefügt.

  • Die Option --output gibt das Verzeichnis an, in dem das maßgeschneiderte Laufzeit-Image erzeugt wird.

jlink ist nicht auf die im vorigen Abschnitt vorgestellten Optionen beschränkt. Tabelle 1 zeigt die wichtigsten Optionen, die mit dem jlink-Befehl verwendet werden können.

Name der Option

Beschreibung

- -help

Druckt alle Optionen

- -module-path <Modulpfad >

Definiert den Modulpfad

- -add-modules <Name des Modul>

Spezifiziert die Root-Module, die aufgelöst werden

- -output <Name des Verzeichnisses>

Spezifiziert den Namen des Verzeichnisses, in dem das Laufzeit-Image erzeugt wird

- -limit-modules <Liste der Modulnamen>

Begrenzt die Gruppe der Module

- -version

Zeigt die Versionsinformationen an

- -save-opts <Name der Datei>

Speichert die jlink-Optionen in der angegebenen Datei

- -strip-debug

Streift die Debug-Informationen

- -disable-plugin <Name des Plug-ins>

Deaktiviert das Plug-in

- -list-plugins

Listet alle verfügbaren jlink-Plug-ins, die über die Kommandozeile erreichbar sind

- -ignore-signing-information

Überwindet einen Fehler, wenn signierte modulare JAR-Dateien mit dem Laufzeit-Image verknüpft sind

@<Name der Datei>

Liest alle Optionen aus der als Argument angegebenen Datei

Tabelle 1: Optionen, die mit dem jlink-Befehl verwendet werden können

Laufzeit-Image mit Linking erzeugen

Linking ist eine neue Phase in der Softwareentwicklung, die optional ist. Diese Phase kann in Java 9 zum Einsatz kommen, falls wir eine modulare Anwendung haben. Ihre Aufgabe ist, ein Laufzeit-Image zu erzeugen, in dem eine Sammlung von Modulen zusammen mit den transitiven Abhängigkeiten zusammengestellt wird. Gemäß OpenJDK erlaubt das Linking künftig viele Optimierungen, die zur Kompilierungszeit oder Laufzeit fast unmöglich sind. Das Ergebnis des Linkers ist plattformunabhängig. Der Linker kann zwei oder mehr Ziele verknüpfen. Wenn Sie beispielsweise das Betriebssystem A verwenden, können Sie auf das Betriebssystem B erfolgreich zielen, vorausgesetzt, dass Ihr Modulpfad die Module für das Betriebssystem B besitzt.

Das Modul jdk.jlink

Abbildung 2 zeigt den Modulgraphen, der das jdk.jlink-Modul mit seinen Abhängigkeiten enthält.

jecan_java9_2.tif_fmt1.jpgAbb. 2: Modulgraph, der das jdk.jlink-Modul mit Abhängigkeiten enthält

Das Modul jdk.jlink enthält verschiedene Java-Klassen im tools-Verzeichnis. Es gibt ein jimage-Verzeichnis, ein jlink-Verzeichnis und ein jmod-Verzeichnis innerhalb des Tools-Verzeichnisses. Das Modul jdk.jlink hat Abhängigkeiten auf das jdk.internal.opt-Modul und auf das jdk.jdeps-Modul, wie in seinem Deskriptor module-info.java ausgedrückt wird. Das Modul jdk.jdeps hat eine Abhängigkeit zum Modul jdk.compiler. Das Modul jdk.compiler hat eine Abhängigkeit zum Modul java.compiler. Dieses letzte Modul benötigt wiederum das Modul java.logging, und das Modul java.logging benötigt das Modul java.base.

In Abbildung 2 haben wir die Nicht-Standard-JDK-Module (jdk.jlink, jdk.internal.opt, jdk.jdeps und jdk.compiler) grün und die Standard-JDK-Module (java.compiler, java.logging und java.base) blau dargestellt. Die durchgezogenen Linien symbolisieren eine implizierte Lesbarkeit. Die ...

Neugierig geworden? Wir haben diese Angebote für dich:

Angebote für Teams

Für Firmen haben wir individuelle Teamlizenzen. Wir erstellen Ihnen gerne ein passendes Angebot.

Das Library-Modell:
IP-Zugang

Das Company-Modell:
Domain-Zugang