Modules Java: Une application exemple – Intérêts

  • Modules Java: Présentation et concepts
  • Modules Java: JRE modulaire
  • Modules Java: Une application exemple – Conception
  • Cet article: Modules Java: Une application exemple – Intérêts
  • 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.java
    
    Contenu 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/*.jar
    
    Le résultat doit être: modules java exemplePour exécuter l’application:
    java --module-path spmodules/ -m net.mtuto.superprocess
    
    Essayer 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.superprocess
    
    L’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.repartition
    
    Ce 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.jar
    
    Le 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.

    5. Réalisation plus rapide

    Avec une architecture modulaire, les modules Java constituent des unités applicatives avec un couplage faible entre elles. Ceci favorise la réalisation de ces unités par des équipes différentes travaillant en parallèle. Cette architecture favorise également les tests unitaires automatisés du code réalisé.]]>