Je suis actuellement en train d’explorer Java 9+ et JavaFX pour la réécriture de l’application Opencomp Genie qui permet aux enseignants en école élémentaire de détecter automatiquement à partir d’une numérisation (scan) des copies de leurs élèves les résultats après correction et de les envoyer en un clic sur Opencomp.
Dans cet article, nous allons voir comment utiliser un .jar
d’une librairie standard qui ne contient pas de fichier module-info.java
par défaut et qui donc, sans transformation ne sera pas utilisable pour une application modulaire ou l’on utilisera jlink
pour créer ensuite un environnement d’exécution personnalisée (jvm
et modules nécessaires à l’exécution du programme).
Le gros morceau à partir de Java 9 est l’introduction du concept de modules et donc d’application modulaire. Le gros intérêt, c’est que ça permet de générer avec jlink
une machine virtuelle Java avec uniquement les morceaux nécessaires à l’exécution du programme (elle est donc plus légère qu’une jvm
« complète »).
En guise d’introduction sur les modules Java, je vous conseille cette vidéo de la Devoox France qui résume je trouve plutôt bien :
Quand on utilise donc, par exemple, jpackage
pour packager son application, ce dernier utilise jlink
pour créer la JVM personnalisée et optimisée pour le programme à exécuter avec uniquement les modules nécessaires.
Cependant, quand l’application comporte des .jar
ne comportant pas de fichier module-info.java
, on sera confronté, lors de l’exécution de jlink
ou de jpackage
donc à l’erreur suivante :
Error: automatic module cannot be used with jlink
Pour régler cela, on va donc devoir générer le fichier module-info.java
, le compiler en un module-info.class
et enfin l’incorporer à notre .jar
existant.
# On se déplace dans le répertoire contenant le .jar à patcher
cd src/com/opencomp/genie/vendor/
# Avec jdeps, on génère le module-info.java pour ce .jar (ici Apache PDFBox)
jdeps --ignore-missing-deps --generate-module-info . pdfbox-app-3.0.0-alpha2.jar
# On compile notre module-info.java en un module-info.class
javac --patch-module pdfbox.app=pdfbox-app-3.0.0-alpha2.jar pdfbox.app/module-info.java
# On incorpore le module-info.class dans le .jar d'origine
jar uf pdfbox-app-3.0.0-alpha2.jar -C pdfbox.app/ module-info.class