Java 9 Multi-Release JAR: Plattformspezifische Klassenversionen in einem Archiv
Was ist ein Multi-Release JAR?
Ein Multi-Release JAR (MRJAR) ermöglicht, verschiedene Versionen derselben Klasse für unterschiedliche Java-Laufzeitversionen in einem JAR zu bündeln. Die JVM lädt zur Laufzeit automatisch die passende Version.
Struktur
mein-mrjar.jar
├── META-INF/
│ ├── MANIFEST.MF ← enthält: Multi-Release: true
│ └── versions/
│ └── 9/ ← Klassen für Java 9+
│ └── com/beispiel/Tester.class
└── com/beispiel/Tester.class ← Basisklasse (Java 8 oder älter)
MANIFEST.MFmussMulti-Release: trueim Hauptabschnitt enthalten.- Unter
META-INF/versions/liegen klassen für Java/ N(9, 10, 11, …). - Bei Start auf Java
Nwerden Klassen ausversions/N/vor den Basisklassen geladen.
Schritt-für-Schritt Beispiel
1. Basisklasse (Java 7/8 kompatibel)
// c:/test/java7/com/beispiel/Tester.java
package com.beispiel;
public class Tester {
public static void main(String[] args) {
System.out.println("Inside Java 7");
}
}
2. Java-9-spezifische Implementierung (nutzt z. B. Module, var, ...)
// c:/test/java9/com/beispiel/Tester.java
package com.beispiel;
public class Tester {
public static void main(String[] args) {
System.out.println("Inside Java 9");
}
}
3. Kompilieren mit --release
javac --release 9 -d java9 java9/com/beispiel/Tester.java
javac --release 7 -d java7 java7/com/beispiel/Tester.java
4. MRJAR erzeugen
jar --create --file test.jar \
-C java7 . \
--release 9 -C java9 .
Warnung „multiple resources with same name“ ist normal & erwartet.
5. Testen
# Auf Java 7/8
java -cp test.jar com.beispiel.Tester
# Ausgabe: Inside Java 7
# Auf Java 9+
java -cp test.jar com.beispiel.Tester
# Ausgabe: Inside Java 9
Wichtige Regeln
- Klassen in
versions/N/müssen dasselbe Paket & dieselben öffentlichen Signaturen haben wie Basisklassen (binäre Kompatibilität). - Nur
.class-Dateien & Ressourcen erlaubt (keinemodule-info.classin Version-Verzeichnissen). Multi-Release: trueim Manifest ist Pflicht.- Java 9+ liest Version-Verzeichnisse absteigend (z. B. 11 → 10 → 9 → Base).
Anwendungsfälle
- Neue APIs nutzen (z. B.
StackWalker,ProcessHandle,VarHandles) auf neuen JDKs, Fallback auf alten. - Performance-Optimierungen für neuere GCs/VMs.
- Bibliotheken, die lange Java-Versionen unterstützen müssen (z. B. 8–21).
Tooling
- Maven:
maven-jar-plugin3.1.0+ mit<multiRelease>true</multiRelease>. - Gradle: Ab 5.0 natives MRJAR-Support via
jar { manifest { attributes 'Multi-Release': 'true' } }+ SourceSets.
Java
- Java Operatoren meistern: Typen, Syntax und praktische Beispiele
- 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 anonyme innere Klassen meistern: Definition, Syntax und praktische Beispiele
- 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
- Java Vector verstehen: Verwendung, Funktionen und Vergleich mit ArrayList