1. Réalisation finale de l’application exemple
Pour finaliser la réalisation de l’application présentée comme exemple d’utilisation des modules Java, on va créer le module principal net.mtuto.superprocess. Ce module contient le point d’entrée de l’application. Se positionner dans le dossier de travail application/. Créer, ensuite, la classe unique de ce module:mkdir src/net/mtuto/superprocess/ vi src/net/mtuto/superprocess/SProcesseur.javaContenu de ce fichier:
package net.mtuto.superprocess; import java.util.*; import net.mtuto.repartition.facade.Repartiteur; public class SProcesseur { public static void main( String[] args ) { System.out.print("Super processeur, que voulez-vous traiter ?: "); Scanner scanner = new Scanner(System.in); String sujet = scanner.nextLine(); Repartiteur r = new Repartiteur(); List<String> lr = r.traiter(sujet); for (String s: lr) System.out.println(s); } }Créer le descripteur de ce module principal dans src/module-info.java:
module net.mtuto.superprocess { exports net.mtuto.superprocess; requires net.mtuto.repartition; }Enfin, compiler et créer le fichier JAR du module:
javac --add-modules net.mtuto.repartition -p spmodules/ -d classes src/module-info.java src/net/mtuto/superprocess/SProcesseur.java jar --create --file spmodules/superprocess.jar --main-class net.mtuto.superprocess.SProcesseur -C classes/ .
2. Essais d’exécution
A ce stade, la réalisation de l’application est achevée. L’ensemble des éléments de l’application est sous forme de modules Java. Ces modules sont contenus dans des fichiers JAR qui se trouvent dans le dossier application/spmodules. Exécuter:ls -l spmodules/*.jarLe résultat doit être: Pour exécuter l’application:
java --module-path spmodules/ -m net.mtuto.superprocessEssayer plusieurs exécutions, avec à chaque fois un objet différent du traitement: 1234, 1234 + 5678, 1234 x 5678, finir et enfin: marcher. Remarquer que l’application répond bien au cahier des charges de départ.
3. Vérification préalable de la cohérence des modules
L’un des apports importants des modules Java est la vérification préalable à l’exécution de la cohérence des modules constituant une application. En Java 1.8-, cette vérificartion est inexistante et la JVM charge les classes exécutées au fur et à mesure de l’avancement de l’exécution et en se fiant à l’ordre définit dans le classpath. De ce fait, ce n’est qu’au cours de l’exécution que la JVM peut se rendre compte de l’absence (ou l’incohérence) d’une partie du code exécutable. Supprimons un module du dossier qui les contient et tentons de lancer l’application. Exécuter dans l’ordre:mkdir tmp mv spmodules/calcul.jar tmp/ java --module-path spmodules/ -m net.mtuto.superprocessL’application ne s’exécute pas et on obtient un message d’erreur dès le lancement:
Error occurred during initialization of boot layer java.lang.module.FindException: Module net.mtuto.calcul not found, required by net.mtuto.repartitionCe message est très claire: il manque le module net.mtuto.calcul à l’arbre de dépendance de l’application. Exécuter maintenant:
cp -p tmp/calcul.jar spmodules/ mv tmp/calcul.jar spmodules/calcul2.jarLe module net.mtuto.calcul est, maintenant, dupliqué. L’application ne s’exécute pas et on obtient un message d’erreur au lancement:
Error occurred during initialization of boot layer java.lang.module.FindException: Two versions of module net.mtuto.calcul found in spmodules (calcul.jar and calcul2.jar)Fini le risque d’utilisation de plusieurs versions des mêmes librairies, les conflits de versions et le JAR Hell (enfin je ne suis pas tout à fait certain de ce dernier point car il est trop tôt pour en être certain mais on l’espère bien). Supprimer le fichier calcul2.jar pour pouvoir poursuivre dans de bonnes conditions.
4. Evolution fonctionnelle facilitée
On se propose de faire évoluer le fonctionnement de l’application de manière à rendre le résultat de calcul plus lisible. La réponse doit comporter l’opération demandée = résultat au lieu du résultat seul. Au regard de l’architecture modulaire de l’application, seul le module net.mtuto.calcul doit être modifié. De plus seule la classe de façade Calculer.java doit l’être. Tout le risque de la modification se trouve donc confiné à cette partie du code applicatif. Modifier cette classe de manière que deux lignes des méthodes addition et multiplication deviennent:... return opAddition + " = " + addition.additionner(a,b).toString(); ... return opMultiplication + " = " + multiplication.multiplier(a,b).toString(); ...Après cela, on reconstruit le module calcul seulement.
cd spmodules/calcul javac -d classes src/*.java src/net/mtuto/calcul/facade/*.java src/net/mtuto/calcul/traitement/*.java jar --create -M --file ../calcul.jar -C classes/ .La partie modifiée étant bien encapsulée et isolée du reste du code, on peut sans prendre de risque, ne tester que cette partie modifiée. Souvent un test unitaire automatisé suffit.