Java 9 Modulsystem: Module, jlink & Custom Runtime Images erstellen
Was ist ein Modul?
Ein Modul ist eine benannte, selbstbeschreibende Sammlung von Code & Daten. Es definiert explizit:
- Welche Pakete es exportiert (öffentlich API).
- Von welchen anderen Modulen es abhängt (
requires). - Welche Services es nutzt oder bereitstellt.
Neue Phasen & Tools
- Link Time (neu): Phase zwischen Compile Time & Run Time.
jlinkassembliert & optimiert Module zu einem Custom Runtime Image (minimale JRE). javac,java,jlinkerhalten--module-pathOption.- Modular JAR: Enthält
module-info.classim Root. - JMOD Format: Verpackungsformat (ähnlich JAR) für native Code & Config-Dateien; Input für
jlink.
Schritt-für-Schritt: Modul erstellen & ausführen
1. Verzeichnisstruktur anlegen
C:\JAVA\src\com.beispiel.gruesse\module-info.java
C:\JAVA\src\com.beispiel.gruesse\com\beispiel\gruesse\Java9Tester.java
2. module-info.java
module com.beispiel.gruesse {
// keine requires – nutzt nur java.base (implizit)
}
3. Anwendungs-Code
package com.beispiel.gruesse;
public class Java9Tester {
public static void main(String[] args) {
System.out.println("Hallo Welt aus Modul!");
}
}
4. Kompilieren in mods/
javac -d mods/com.beispiel.gruesse \
src/com.beispiel.gruesse/module-info.java \
src/com.beispiel.gruesse/com/beispiel/gruesse/Java9Tester.java
5. Ausführen
java --module-path mods -m com.beispiel.gruesse/com.beispiel.gruesse.Java9Tester
--module-path mods: Modul-Verzeichnis.-m <modul>/<MainClass>: Hauptmodul & Main-Klasse.
Ausgabe: Hallo Welt aus Modul!
Custom Runtime Image mit jlink
jlink --module-path mods:$JAVA_HOME/jmods \
--add-modules com.beispiel.gruesse \
--output mein-runtime
Erzeugt mein-runtime/ mit nur den nötigen Modulen (java.base + com.beispiel.gruesse). Starten:
mein-runtime/bin/java -m com.beispiel.gruesse/com.beispiel.gruesse.Java9Tester
Wichtige Konzepte
| Konzept | Beschreibung |
|---|---|
| Readability | requires macht Typen des Zielmoduls zur Compile- & Laufzeit sichtbar. |
| Accessibility | Nur exported Pakete sind für andere Module zugreifbar (Kapselung). |
| Implied Readability | requires transitive – Abhängigkeit wird an Nutzer weitergereicht. |
| Services | uses / provides ... with – entkoppelt Implementierung via ServiceLoader. |
| Open Modules | opens für Reflection-Zugriff (z. B. Frameworks wie Spring/Hibernate). |
Migration bestehender Anwendungen
- Unnamed Module: Klassen auf Classpath (nicht Module Path) laufen im „Unnamed Module“ – lesen alle exportierten Pakete aller Module.
- Automatic Modules: JARs auf Module Path ohne
module-infowerden zu Automatic Modules (Name = JAR-Name, exportiert alles, liest alles). - Schrittweise Migration: Library für Library modulieren.
Java
- C# using-Anweisungen meistern: Importe, Aliase und statische Direktiven
- Java Operatoren meistern: Typen, Syntax und praktische Beispiele
- Java Ein- und Ausgabe meistern: Drucken, Lesen und Formatieren Ihrer Daten
- Java Kommentare: Typen, Verwendung und Best Practices
- Java Enhanced For-Schleife meistern: Syntax, Beispiele und Best Practices
- Java Strings meistern: Erstellung, Methoden und Best Practices
- Java-Schnittstellen meistern: Konzepte, Implementierung und Best Practices
- Java Try-With-Resources meistern: Automatisches Ressourcenmanagement erklärt
- Java Annotations erklärt: Typen, Platzierung und praktische Beispiele
- Java Assertions: Praktischer Leitfaden zur Fehlererkennung und Code-Reliabilität