Wie füge ich ein Java 9 Modul über manifest.mf hinzu?

8

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?

    
Horcrux7 25.04.2017, 09:19
quelle

3 Antworten

6

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:

%Vor%

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:

  • Kompilieren Sie alle Klassen außer module-info.java mit javac --release 8
  • Kompilieren Sie module-info.java mit javac --release 9 .
  • Erstellen Sie eine JAR-Datei, so dass sie die folgende Struktur aufweist:
%Vor%

Das resultierende JAR sollte mit Java 8 und Java 9 kompatibel sein.

UPDATE:

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.

    
ZhekaKozlov 25.04.2017 09:49
quelle
3

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 8 und 9

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.

Wird es Ihr Problem lösen?

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.

Vollständige Modularisierung

Wenn Ihr Modul im Modulpfad verwendet wird, stellen Sie die Barrierefreiheitsregeln sicher :

  1. Ihre Clients können nur öffentliche Typen in Paketen verwenden, die Sie exportiert haben (bei der Kompilierung und zur Laufzeit)
  2. Ihr Code sieht nur Module, von denen Sie abhängig sind

Dies bedeutet:

  1. Sie müssen Exporte in Ihre Moduldeklaration aufnehmen
  2. Sie müssen alle Abhängigkeiten angeben, nicht nur für die zwei JDK-Module

Besonders der zweite Punkt kann schwierig sein, wenn Sie auf Projekte angewiesen sind, die noch nicht modularisiert sind, aber das ist eine andere Frage.

Nicolai 27.04.2017 07:00
quelle
3

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

Ссылка Ссылка

    
Horcrux7 27.05.2017 10:22
quelle

Tags und Links