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