[JAVA] Créer une JVM pour la distribution d'applications avec les modules JDK 9 et jlink

Le Java 9 tant attendu est enfin sorti avant JavaOne 2017!

Au fait, en parlant de Java 9, ce qui est préoccupant, c'est la fonction du module par puzzle. Je vois souvent comment utiliser le module, mais j'étais personnellement intéressé par jlink, j'ai donc résumé les résultats que j'ai essayés.

introduction

Quant à Jigsaw, du moins pour le moment, il n'est pas possible de remplacer un seul binaire comme fat-jar ou de faire un langage seul.

Cependant, il est possible de générer une JVM pour la distribution incluant des applications en utilisant des modules et jlink, et cette fois nous allons vous l'expliquer. Je n'aborderai pas le fait que le module a permis d'améliorer la portée de divulgation et de détecter les dépendances tôt, donc je parlerai de [cet article](https://qiita.com/nmatsui/items/73ad642838631bcdc92e#%E3%82] % 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) Je pense que vous devriez vous y référer.

Préparation du code

Tout d'abord, préparez le code. Créez un échantillon que la bibliothèque est appelée en trois couches à partir de l'application, comme suit.

alt

Ce qui a été fait ici. J'omettrai les détails car je n'en parlerai pas en particulier, mais je mets module-info.java dans chaque répertoire supérieur et j'écris les paramètres du module. https://github.com/koduki/example-jlink

Construire

Vient ensuite la construction de chaque module.

Avant cela, créez d'abord le répertoire dans lequel le module sera placé.

$ mkdir modules

Évidemment, nous construirons dans l'ordre à partir de celui sans dépendance.

$ javac -d commons/classes/ -cp commons/src/main/java $(find commons/src/main/java -name "*.java")
$ jar cvf modules/commons.jar -C commons/classes/ .

La construction ressemble essentiellement à un fichier jar normal, sauf que l'option p spécifie le répertoire du module au moment de la compilation. Sachez également que les anciennes versions ont l'option répertoriée comme «mp».

$ 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/ .

Une fois la bibliothèque construite, l'application principale. Cependant, c'est comme les autres.

$ javac -d apps/classes/ -cp apps/src/ -p modules $(find apps/src -name "*.java")
$ jar cvf modules/app.jar -C apps/classes/ .

Il peut être exécuté sous la forme suivante.

$ java -p modules/ -m apps/cn.orz.pascal.app.MyApp
Hello, cn.orz.pascal.common.CommonLib
Hello, cn.orz.pascal.lib.MyLib
Hello, MyApp

Avez-vous confirmé l'exécution? Lorsque vous spécifiez un module, décrivez-le sous la forme de nom de module / classe à exécuter avec l'option m.

Création d'une JVM pour la distribution avec JLink

Avec cela seul, je ne suis pas très content du point de vue de la distribution, il est donc enfin temps pour JLink. Avec JLink, vous pouvez créer une JVM avec la configuration minimale requise pour le module spécifié. Cela signifie que vous n'avez pas besoin d'avoir une bibliothèque Swing ou AWT dans votre application Web.

Dans le cas de Mac, si vous venez de l'installer, le chemin ne passe pas, il correspond donc comme suit.

$ export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk-9.jdk/Contents/Home/   
$ alias jlink=${JAVA_HOME}/bin/jlink     

Vient ensuite l'exécution du lien par jlink. Cette fois, nous créons également un lanceur qui exécute ʻapps / cn.orz.pascal.app.MyApp` et compresse le zip entier.

$ jlink --compress=2 --module-path $JAVA_HOME/jmods:modules --add-modules apps --output dist/my-app --launcher myapp=apps/cn.orz.pascal.app.MyApp 

Lorsqu'elle est exécutée, my-app est créée dans le répertoire dist. Lorsqu'il est exécuté, c'est comme suit.

$ ./dist/my-app/bin/myapp 
Hello, cn.orz.pascal.common.CommonLib
Hello, cn.orz.pascal.lib.MyLib
Hello, MyApp

Étant donné que my-app contient le module spécifié et la configuration minimale de la JVM, il vous suffit de distribuer ce répertoire et il fonctionnera tel quel, même dans un environnement sans JVM. C'est portable!

La capacité est la suivante cette fois. Ça fait du bien.

$ du -h dist|tail -n1
 24M	dist

Résumé

J'ai essayé de créer une JVM pour la distribution d'applications par jlink. Bien qu'il ne soit pas packagé, il semble être beaucoup plus facile à distribuer dans un environnement où JVM n'est pas installé. Si c'est pour une utilisation serveur, ce ne serait pas un problème si vous le packagez dans Docker.

Il ne convient pas à la distribution dans un seul binaire tel que le système de commande, qui a été réalisé par go language ou java fat-jar, mais je pense que cela peut être pleinement réalisé si quelque chose comme electron-packager est créé à l'avenir.

Eh bien, bon piratage!

Recommended Posts

Créer une JVM pour la distribution d'applications avec les modules JDK 9 et jlink
[Rails6] Créer une nouvelle application avec Rails [Débutant]
[Rails 5] Créer une nouvelle application avec Rails [Débutant]
Créez une application de recherche simple avec Spring Boot
Créez un modèle pour le widget iOS14 avec la configuration d'intention.
Créez une application de chat avec WebSocket (Tyrus) + libGDX + Kotlin
Tutoriel pour créer un blog avec Rails pour les débutants Partie 1
[Rails] J'ai essayé de créer une mini application avec FullCalendar
Créez une application Web Hello World avec Spring Framework + Jetty
Tutoriel pour créer un blog avec Rails pour les débutants Partie 2
Comment créer et lancer un Dockerfile pour Payara Micro
Tutoriel pour créer un blog avec Rails pour les débutants Partie 0
Créez un terrain de jeu avec Xcode 12
Créez une application mémo avec Tomcat + JSP + Servlet + MySQL à l'aide d'Eclipse
Créer un site de catalogue d'applications à l'aide de l'interface de ligne de commande pour Microsoft 365 avec Docker
[Swift] Créez un projet avec Xcode (ver 12.1) et affichez "Hello, World!"
Créez une énumération haute performance avec des champs et des méthodes comme Java avec JavaScript
[Java] Créons un Minecraft Mod 1.16.1 [Ajouter et générer des arbres]
[Java] Créons un Minecraft Mod 1.14.4 [9. Ajouter et générer des arbres]
Créez une application de recherche de restaurant avec l'API IBM Watson + Guru Navi (avec source)
Créez une image Docker pour redoc-cli et enregistrez-la sur Docker Hub
Introduction au développement d'applications Android 1 Installation de JDK et d'Android Studio pour mac
[Java] Créons un Minecraft Mod 1.14.4 [8. Ajouter et générer du minerai]
Créons un mécanisme polymorphe de paramètres avec Generic Dao et Hibernate
[OpenJDK11 & JavaFX13] Créez une application javaFX avec IntelliJ + gradle et créez un package qui peut être distribué avec un JRE léger.
Créez un environnement Vue3 avec Docker!
Créez une application avec Spring Boot 2
Créer une application de minuterie avec de la boue
Créer une nouvelle application avec Rails
Créez une application avec Spring Boot
Créer une application en ligne de commande avec maven
Essayez de créer une application client serveur
Créez des exceptions avec une interface fluide
Créer un serveur fluentd pour les tests
Créez un projet de développement d'application Spring Boot avec la commande cURL + tar
Créez un CRUD simple avec SpringBoot + JPA + Thymeleaf ② ~ Création d'écran et de fonctions ~
[Ruby on Rails] Créez un graphique circulaire des totaux par colonne avec Chartkick
[Java] Créez un fichier jar compressé et non compressé avec la commande jar
[Docker] Comment créer un environnement virtuel pour les applications Rails et Nuxt.js
Exécutable serveur avec Spring gradle Comment créer JAR et WAR
Créez une application de résumé de nouvelles techniques de style LINEnews avec Rails x LineBot! [Partie 1]
Créer un environnement de développement d'applications Web Java avec Docker pour Mac Part2
Comment créer une application avec un mécanisme de plug-in [C # et Java]