2017-11-10 1 views
7

Angenommen, ich besitze eine Bibliothek lib.jar, für die ich den Quellcode nicht habe (oder er ist in einer Nicht-Java-Sprache geschrieben, die Module noch nicht kennt). lib.jar hat keine module-info.class und ich möchte es nicht als ein automatisches Modul verwenden, also würde ich gerne module-info.class hinein injizieren.Wie Moduldeklaration in JAR injizieren?

ich zum ersten Mal erzeugen module-info.java mit dem folgenden Befehl:

jdeps --generate-module-info . lib.jar 

dies erzeugt so etwas Angenommen:

module lib { 
    exports package1; 
    exports package2; 
} 

Dann versuche ich es zu kompilieren, aber javac schlägt fehl, da die Pakete package1 und package2 tun existiert nicht:

> javac module-info.java 
module-info.java:4: error: package is empty or does not exist: package1 

Natürlich kann ich Verzeichnisse package1 und package2 mit Dummy-Klassen in ihnen erstellen, aber gibt es einen besseren Ansatz?

Antwort

6

Ja, dies ist mit der Option --patch-module möglich. Diese Option wird am häufigsten zur Laufzeit verwendet, aber es funktioniert auch bei der Kompilierung:

javac --patch-module <module name>=<path to jar> module-info.java 
+0

, wenn ich diesen Befehl verwenden, habe ich noch den Fehler: > javac module-info.java module-info.java:4: Fehler: Paket ist leer oder nicht vorhanden ist : package1 Irgendwelche ideia, warum es für mich nicht funktioniert? –

+0

@TiagoSantos Existiert das Paket im JAR? – ZhekaKozlov

+0

Ja, alles scheint in Ordnung, ich habe es mit der oben genannten Lösung von nullpointer funktioniert, ich stimme zu, dass Ihre Lösung eleganter ist, das einzige Problem ist, dass nicht funktioniert mit meinen .jars:/in 2 verschiedenen versucht –

5

Alternativ kann die module-info.java erzeugt kompilieren müssen Sie auch den Inhalt der JAR in ein Verzeichnis extrahieren.

Dann kompilieren Sie die module-info.java mit dem Ausgabeverzeichnis (-d) auf das Verzeichnis, in dem Sie den Inhalt extrahiert.

Credits :- Alan

+1

Dank uf, wusste ich nicht über diesen Ansatz – ZhekaKozlov

+1

ich meine akzeptiert eigene Antwort, weil ich denke, dass mein Weg etwas eleganter ist. Extrahieren von Dateien ist ein zusätzlicher Schritt, der ein wenig unbequem ist (besonders für Werkzeuge). – ZhekaKozlov

+0

@ZhekaKozlov Ich stimme zu, das ist in der Tat sauberer. Ich hoffe, ich sollte das auch nicht entfernen.;) – nullpointer