Das lang erwartete Java 9 wurde endlich vor JavaOne 2017 veröffentlicht!
Bei Java 9 geht es übrigens um die Modulfunktion per Puzzle. Ich sehe oft, wie man das Modul benutzt, aber ich war persönlich an jlink interessiert, also habe ich die Ergebnisse zusammengefasst, die ich versucht habe.
Was Jigsaw betrifft, ist es zumindest vorerst nicht möglich, eine einzelne Binärdatei wie Fat-Jar zu ersetzen oder die Sprache alleine zu verwenden.
Es ist jedoch möglich, mithilfe von Modulen und jlink eine JVM für die Verteilung einschließlich Anwendungen zu generieren. Dieses Mal werden wir dies erläutern. Ich werde nicht auf die Tatsache eingehen, dass das Modul es ermöglicht hat, den Offenlegungsbereich zu verbessern und Abhängigkeiten frühzeitig zu erkennen, daher dieser Artikel dieser Artikel % B5% E3% 83% BC% E3% 83% 93% E3% 82% B9% E3% 81% 8C% E5% BF% 85% E8% A6% 81% E3% 81% A8% E3% 81% 99 % E3% 82% 8B% E3% 83% A9% E3% 82% A4% E3% 83% 96% E3% 83% A9% E3% 83% AA) Ich denke, Sie sollten sich darauf beziehen.
Bereiten Sie zuerst den Code vor. Erstellen Sie ein Beispiel dafür, dass die Bibliothek in drei Ebenen aus der Anwendung wie folgt aufgerufen wird.
Was wurde hier gemacht. Ich werde die Details weglassen, weil ich nicht speziell darüber sprechen werde, aber ich lege module-info.java
in jedes oberste Verzeichnis und schreibe die Moduleinstellungen.
https://github.com/koduki/example-jlink
Als nächstes folgt der Aufbau jedes Moduls.
Erstellen Sie zuvor zunächst das Verzeichnis, in dem das Modul abgelegt werden soll.
$ mkdir modules
Offensichtlich werden wir in der Reihenfolge von der ohne Abhängigkeit bauen.
$ javac -d commons/classes/ -cp commons/src/main/java $(find commons/src/main/java -name "*.java")
$ jar cvf modules/commons.jar -C commons/classes/ .
Der Build ist im Grunde der gleiche wie bei einem normalen JAR, aber der Unterschied besteht darin, dass Sie das Modulverzeichnis zur Kompilierungszeit mit der Option p
angeben.
Beachten Sie auch, dass ältere Versionen die Option "mp" haben.
$ javac -d libs/classes/ -cp "libs/src/main/java/" -p modules/ $(find libs/src/main/java -name "*.java")
$ jar cvf modules/libs.jar -C libs/classes/ .
Sobald die Bibliothek erstellt ist, die Hauptanwendung. Dies ist jedoch genau wie bei den anderen.
$ javac -d apps/classes/ -cp apps/src/ -p modules $(find apps/src -name "*.java")
$ jar cvf modules/app.jar -C apps/classes/ .
Es kann in der folgenden Form ausgeführt werden.
$ java -p modules/ -m apps/cn.orz.pascal.app.MyApp
Hello, cn.orz.pascal.common.CommonLib
Hello, cn.orz.pascal.lib.MyLib
Hello, MyApp
Haben Sie die Ausführung bestätigt? Wenn Sie ein Modul angeben, beschreiben Sie es in Form von "Modulname / auszuführende Klasse" mit der Option "m".
Allein damit bin ich aus Vertriebssicht nicht sehr zufrieden, also ist es endlich Zeit für JLink. Mit JLink können Sie eine JVM mit der für das angegebene Modul erforderlichen Mindestkonfiguration erstellen. Dies bedeutet, dass Ihre Web-App keine Swing- oder AWT-Bibliothek enthalten muss.
Wenn Sie den Mac gerade installiert haben, wird der Pfad nicht übergeben, sodass er wie folgt entspricht.
$ export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk-9.jdk/Contents/Home/
$ alias jlink=${JAVA_HOME}/bin/jlink
Als nächstes folgt die Ausführung des Links durch jlink. Dieses Mal erstellen wir auch einen Launcher, der apps / cn.orz.pascal.app.MyApp
ausführt und die gesamte Zip-Datei komprimiert.
$ jlink --compress=2 --module-path $JAVA_HOME/jmods:modules --add-modules apps --output dist/my-app --launcher myapp=apps/cn.orz.pascal.app.MyApp
Bei der Ausführung wird my-app im Verzeichnis dist erstellt. Bei der Ausführung ist es wie folgt.
$ ./dist/my-app/bin/myapp
Hello, cn.orz.pascal.common.CommonLib
Hello, cn.orz.pascal.lib.MyLib
Hello, MyApp
Da my-app das angegebene Modul und die Mindestkonfigurations-JVM enthält, verteilen Sie dieses Verzeichnis einfach und es funktioniert so, wie es auch in einer Umgebung ohne JVM ist. Es ist tragbar!
Die Kapazität ist diesmal wie folgt. Es fühlt sich ziemlich gut an.
$ du -h dist|tail -n1
24M dist
Wenn es für den Server verwendet wird, ist es kein Problem, wenn Sie es in Docker verpacken.
Es ist nicht für die Verteilung in einer einzelnen Binärdatei wie dem Befehlssystem geeignet, das mit go language oder java fat-jar realisiert wurde, aber ich denke, dass es vollständig realisiert werden kann, wenn in Zukunft so etwas wie ein Elektronenpackager hergestellt wird.
Na dann, Happy Hacking!
Recommended Posts