Application modulaire Java et dépendances automodule .jar

Logo du langage Java

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

A propos Jean Traullé

Passionné par l'informatique et les nouvelles technos, titulaire d'un DUT Informatique, d'une LP RGI, et d'un Master MIAGE.
Ce contenu a été publié dans Non classé, avec comme mot(s)-clé(s) , . Vous pouvez le mettre en favoris avec ce permalien.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *