[JAVA] Erstellen Sie eine JVM für die App-Verteilung mit JDK 9-Modulen und jlink

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.

Einführung

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.

Code-Vorbereitung

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.

alt

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

Bauen

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".

Erstellen einer JVM für die Verteilung mit JLink

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

Zusammenfassung

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

Erstellen Sie eine JVM für die App-Verteilung mit JDK 9-Modulen und jlink
[Rails6] Erstelle eine neue App mit Rails [Anfänger]
[Rails 5] Erstelle eine neue App mit Rails [Anfänger]
Erstellen Sie mit Spring Boot eine einfache Such-App
Erstellen Sie eine Vorlage für das iOS14-Widget mit Absichtskonfiguration.
Erstellen Sie eine Chat-App mit WebSocket (Tyrus) + libGDX + Kotlin
Tutorial zum Erstellen eines Blogs mit Rails für Anfänger Teil 1
[Rails] Ich habe versucht, eine Mini-App mit FullCalendar zu erstellen
Erstellen Sie eine Hello World-Webanwendung mit Spring Framework + Jetty
Tutorial zum Erstellen eines Blogs mit Rails für Anfänger Teil 2
So erstellen und starten Sie eine Docker-Datei für Payara Micro
Tutorial zum Erstellen eines Blogs mit Rails für Anfänger Teil 0
Erstellen Sie einen Spielplatz mit Xcode 12
Erstellen Sie eine Memo-App mit Tomcat + JSP + Servlet + MySQL mit Eclipse
Erstellen Sie eine App-Katalogsite mit CLI für Microsoft 365 mit Docker
[Swift] Erstellen Sie ein Projekt mit Xcode (Version 12.1) und zeigen Sie "Hallo Welt!"
Erstellen Sie mit JavaScript eine leistungsstarke Aufzählung mit Feldern und Methoden wie Java
[Java] Erstellen wir einen Minecraft Mod 1.16.1 [Bäume hinzufügen und generieren]
[Java] Erstellen wir einen Minecraft Mod 1.14.4 [9. Bäume hinzufügen und generieren]
Erstellen Sie eine Restaurant-Such-App mit der IBM Watson + Guru Navi-API (mit Quelle).
Erstellen Sie ein Docker-Image für redoc-cli und registrieren Sie es auf Docker Hub
Einführung in die Android App-Entwicklung 1 Installieren von JDK und Android Studio für Mac
[Java] Lass uns einen Minecraft Mod 1.14.4 erstellen [8. Erz hinzufügen und erzeugen]
Lassen Sie uns mit Generic Dao und Hibernate einen Parameter-Polymorph-Mechanismus erstellen
[OpenJDK11 & JavaFX13] Erstellen Sie eine JavaFX-App mit IntelliJ + gradle und erstellen Sie ein Paket, das zusammen mit einer leichten JRE verteilt werden kann.
Erstellen Sie mit Docker eine Vue3-Umgebung!
Erstellen Sie eine App mit Spring Boot 2
Erstellen einer Timer-App mit Schlamm
Erstellen Sie eine neue App mit Rails
Erstellen Sie eine App mit Spring Boot
Erstellen Sie eine Befehlszeilen-App mit maven
Versuchen Sie, eine Server-Client-App zu erstellen
Erstellen Sie Ausnahmen mit einer Fluid-Schnittstelle
Erstellen Sie ein Maven-Projekt mit Befehlen
Erstellen Sie einen fließenden Server zum Testen
Erstellen Sie mit dem Befehl cURL + tar ein Spring Boot-App-Entwicklungsprojekt
Erstellen Sie eine einfache CRUD mit SpringBoot + JPA + Thymeleaf ② ~ Bildschirm- und Funktionserstellung ~
[Ruby on Rails] Erstellen Sie mit Chartick ein kreisförmiges Diagramm der Summen nach Spalten
[Java] Erstellen Sie mit dem Befehl jar eine JAR-Datei, die sowohl komprimiert als auch nicht komprimiert ist
[Docker] So erstellen Sie eine virtuelle Umgebung für Rails- und Nuxt.js-Apps
Server mit Spring Gradle ausführbar So erstellen Sie JAR und WAR
Erstellen Sie mit Rails x LineBot eine App für die Zusammenfassung von technischen Nachrichten im LINEnews-Stil! [Teil 1]
Erstellen Sie mit Docker für Mac Teil2 eine Entwicklungsumgebung für Java-Webanwendungen
So erstellen Sie eine App mit einem Plug-In-Mechanismus [C # und Java]