Java 9 – Jigsaw – Les modules

Je vais te parler de Java 9 alors que Java 10 vient de sortir … Oracle a décidé d’accélérer les mises à jour de Java, en sortant une version majeure toutes les 6 mois, il va falloir se bouger pour suivre … Bref, on va te parler ici de modularité avec la mise en place du projet Jigsaw dans Java 9.

Le code

Tu peux retrouver le code sur ce repository.

Java Modulaire ?

Oui, Java va devenir modulaire, on va même pouvoir définir uniquement ce que l’on a besoin dans la JVM. Regarde le projet “module-jigsaw-persistence” du repository. Tu retrouve le ficher “module-info.java”. C’est un nouveau fichier qui définit un module.
module module.persistence {
    //requires java.base;
    requires java.logging;

    exports fr.lapausedev.persistence.entity;
    exports fr.lapausedev.persistence.repository;
}

En première ligne, on définit le nom du module, ici “module.persistence”. Le module annonce ces dépendances avec le mot clé “requires”. Le module “java.base”, où l’on retrouve l’ensemble des classes de base de Java (comme la classe Object), est par défaut injecté dans chaque module. Je rajoute le module logging de la JVM.

Le mot clé “export” permet de définir les packages visible à l’extérieur. Regarde le projet “module-jigsaw-service”, d’après son fichier “module-info.java”, il dépend du module “module.persistence”.

Essaye d’utiliser la classe “UserRepositoryImpl” dans le projet “module-jigsaw-service”. Si ton IDE n’est pas trop dépassé (Intellij Idea 2018.1 pour mon cas), tu dois avoir une erreur de compilation directement. Le package de cette classe n’est pas défini dans les “exports” du module “module.persistence”. Ainsi, on peut protéger ton module d’utilisation non désirée, c’est très utile afin de mettre en place des points d’entrée précis pour chaque module.

Paramétrer Maven avec Java 9

Afin de mettre en place Java 9 dans Maven, il est important de vérifier que la version majeure de Maven est égale ou supérieure à 3. Le plugin “maven-compiler-plugin” doit avoir une version égale ou supérieure à 3.7. Les modules n’arriveront pas à se trouver sinon. Si tu fais un Maven package sur le projet en essayant d’utiliser une classe non visible, Maven t’expliquera aussi que tu n’as pas le droit. Voici une trace pour mon exemple:
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.7.0:compile (default-compile) on project module-jigsaw-service: Compilation failure
[ERROR] ***/module-jigsaw-service/src/main/java/fr/lapausedev/service/App.java:[6,44] package fr.lapausedev.persistence.repository.impl is not visible
[ERROR] (package fr.lapausedev.persistence.repository.impl is declared in module module.persistence, which does not export it)
Par contre, tu es obligé de définir tes dépendances dans deux endroits, dans le “pom.xml” et dans le “module-info.java”. Est ce qu’il y a moyen de faire plus simple en un seul point ? Le pom.xml pourrait auto-générer un fichier “module-info.java” ?  Pour l’instant, je n’ai pas trouvé d’autre solution.

Conclusion

J’espère que ce petit exemple t’aidera à comprendre et à avancer dans la modularité de Java 9. Si tu as des questions, n’hésites pas à envoyer.

Leave a Reply

Your email address will not be published. Required fields are marked *