Meine Java-Bibliothek sollte mit Java 8 und Java 9 kompatibel sein. Für den Betrieb mit Java 9 benötigen wir einige der Java 9-Module.
Ich weiß, dass ich es über die Befehlszeile mit --add-modules
hinzufügen kann. Aber es ist eine Bibliothek und ich kann die Befehlszeile nicht steuern.
Kann ich das mit manifest.mf
hinzufügen? Oder gibt es eine andere Lösung, die mit Java 8 kompatibel ist?
MANIFEST.MF
hat nichts mit Abhängigkeiten zu tun. Was Sie brauchen, ist eine Datei module-info.java
zu erstellen und Ihre Abhängigkeit dort zu deklarieren:
Wenn Sie jedoch module-info.java
kompilieren und module-info.class
einfach in Ihr JAR einfügen, kann Java 8 es nicht ausführen. Also was zu tun? Es gibt eine neue Funktion in Java 9: Multi-Release-JAR-Dateien ( JEP 238 ). Die Idee ist, dass Sie Java 9-Klassendateien in ein spezielles Verzeichnis ( META-INF/version/9/
) schreiben können und Java 9 sie richtig behandelt (während Java 8 sie ignoriert).
Dies sind also die Schritte, die Sie ausführen sollten:
module-info.java
mit javac --release
8
module-info.java
mit javac --release 9
. Das resultierende JAR sollte mit Java 8 und Java 9 kompatibel sein.
Es stellt sich heraus, dass module-info.class
nicht in den Ordner META-INF
eingefügt werden muss. Sie können es einfach in die Wurzel des JAR setzen. Dies wird den gleichen Effekt haben.
Module drücken Abhängigkeiten in ihrer Moduldeklaration aus, also müssen Sie eine erstellen module-info.java
, definiere den Namen deines Moduls, Abhängigkeiten (in deinem Fall mit requires java.activation
und requires java.xml.bind
) und exportiere (mehr dazu später).
Die Moduldeklaration muss von einem Java 9-Compiler kompiliert werden, um einen Moduldeskriptor module-info.class
zu erstellen, der in den JAR-Stammordner gehört.
Java-Versionen vor 9 ignorieren module-info.class
, was bedeutet, wenn Sie den Rest Ihres Codes für Java 8 kompilieren (entweder mit javac 8
oder mit dem neuen --release
-Flag auf javac 9
), Ihre Bibliothek funktioniert immer noch auf dieser Version.
Sogar Java 9 wird Ihre JAR nur als Modul verarbeiten, wenn es auf landet der Modulpfad Nur dann sieht es die requires
-Klauseln und schließt die Java EE-Module ein, die Sie im Moduldiagramm verwenden . Das bedeutet, dass der Client, der Ihre Bibliothek auf dem Klassenpfad von Java 9 verwendet, die beiden Module noch manuell über die Befehlszeile hinzufügen muss.
Wenn Ihr Modul im Modulpfad verwendet wird, stellen Sie die Barrierefreiheitsregeln sicher :
Dies bedeutet:
Besonders der zweite Punkt kann schwierig sein, wenn Sie auf Projekte angewiesen sind, die noch nicht modularisiert sind, aber das ist eine andere Frage.
Kann sein, dass in den letzten Minuten von Jigsaw die benötigten manifesten Parameter vorhanden sind. Die Nachteile, es funktioniert nur für die Hauptjar-Datei.
Beispiel:
Hinzufügen-Exportieren: java.base / java.lang java.base / java.lang.invoke
oder
Add-Exports-Private: java.base / java.lang java.base / java.lang.invoke
Tags und Links java-9 jigsaw java-module