Comprendre le mécanisme
Un module nomme son unité de code et déclare ses dépendances. exports rend un package accessible selon les règles du système de modules ; opens concerne notamment l’accès réflexif profond. Une classe publique n’est pas pour autant accessible depuis tout module si son package n’est pas exporté. Le mécanisme uses/provides relie consommateurs et fournisseurs de services sans imposer une instanciation concrète dans le code appelant.
Raisonner et vérifier
Compilez avec une version cible explicite et vérifiez l’exécution depuis l’artefact, pas seulement depuis l’IDE. Un JAR modulaire et un JAR classique peuvent être lancés différemment. jlink construit une image d’exécution à partir de modules disponibles ; il ne remplace pas les tests ni la validation de configuration. Documentez aussi les annotations standard et la journalisation nécessaires au diagnostic de votre projet.
Déclarer les dépendances du module
Un module nommé peut décrire les modules qu’il lit et les packages qu’il expose. Cette structure aide à définir une frontière de code plus précise qu’une simple archive contenant des classes. Un JAR sans le même contrat de module ne doit pas être supposé équivalent dans tous les modes d’exécution. Lisez la configuration effective du lancement pour savoir comment les dépendances sont résolues.
Erreur fréquente à comprendre
Un JAR quelconque possède nécessairement le même contrat module-info.
Les modes de packaging ont des caractéristiques différentes.
Public ne signifie pas exporté partout
Une classe public d’un package non exporté ne devient pas librement accessible à tous les modules. L’export participe à la frontière d’accès entre modules, avec les autres règles applicables. Concevez les packages d’API et d’implémentation selon les besoins des consommateurs. Un test réalisé dans un seul module peut masquer cette différence : vérifiez un consommateur séparé qui utilise réellement le contrat exporté.
Erreur fréquente à comprendre
exports ouvre automatiquement toute réflexion profonde privée.
L’ouverture à la réflexion est une notion distincte.
Ouvrir la réflexion de manière ciblée
opens vise des usages de réflexion selon le contexte du module. Ce n’est pas la même déclaration que exports pour les accès ordinaires. Un framework peut demander une ouverture spécifique sans justifier une exposition générale de toute l’implémentation. Limitez le périmètre nécessaire et vérifiez la version ciblée. L’ouverture de code ne donne pas non plus une permission métier à l’utilisateur final du service.
Erreur fréquente à comprendre
opens accorde automatiquement toutes les permissions métier.
L’encapsulation du code ne définit pas les droits utilisateurs.
Aligner compilation et runtime
Un code compilé avec un JDK récent peut utiliser une syntaxe ou une API absente du runtime ciblé. Le succès dans l’IDE ne suffit donc pas. Définissez la version de production et construisez l’artefact avec un contrat compatible. Exécutez ensuite ce livrable dans un environnement propre correspondant à la cible ; ce test couvre des hypothèses que la configuration confortable du poste peut masquer.
Erreur fréquente à comprendre
Compiler sur un JDK récent garantit toute compatibilité ancienne.
La syntaxe et les API utilisées doivent être compatibles.
Le rôle exact de release et jlink
L’option --release aide à cibler une version de langage et d’API selon le compilateur, mais elle n’installe pas le runtime sur le serveur. jlink peut assembler une image d’exécution à partir de modules et de leurs dépendances. Cette image devient un artefact à maintenir et à tester. Conservez sa composition et vérifiez qu’elle contient les capacités réellement utilisées par l’application déployée.
Erreur fréquente à comprendre
--release installe automatiquement le runtime de production.
Le flag de compilation ne provisionne pas le serveur.
Reproduire les dépendances résolues
Une référence flottante peut évoluer entre deux constructions. Conservez les versions résolues et le processus qui produit l’artefact afin de pouvoir comparer une panne à un contenu exact. La reproductibilité ne prouve pas l’absence de vulnérabilité ; elle permet de savoir ce qui a été construit. Une mise à jour doit donc combiner changement identifié, contrôles appropriés et vérification du comportement attendu.
Erreur fréquente à comprendre
Une version flottante garantit toujours le même artefact.
La résolution peut évoluer.
Vérifier les ressources embarquées
La compilation ne prouve pas que tous les fichiers, services et ressources nécessaires sont présents au runtime. Une configuration oubliée ou un chemin dépendant du poste peut échouer après livraison. Lancez l’archive ou l’image réellement construite depuis un environnement sans les fichiers de développement. Contrôlez le parcours utile, pas seulement le démarrage du processus ou l’existence d’un fichier portant le bon nom.
Erreur fréquente à comprendre
Un succès de compilation prouve toutes les ressources à l’exécution.
La compilation ne couvre pas tous les besoins déployés.
Un JAR distribué n’est pas un coffre
Les ressources contenues dans une archive distribuée peuvent être inspectées. Un credential embarqué ne devient pas secret parce qu’il se trouve dans un JAR. Séparez configuration sensible et artefact public selon le mode de déploiement. Testez le contenu final et les chemins de diagnostic ; retirer un secret d’une nouvelle version ne révoque pas les copies de l’ancienne déjà diffusées.
Erreur fréquente à comprendre
Un fichier embarqué devient secret parce qu’il est dans un JAR.
Une archive distribuée peut être inspectée.
Mesurer la bonne santé du service
Un port ouvert démontre qu’un processus écoute, pas que le parcours métier fonctionne. Le contrôle de santé doit correspondre à une garantie définie : identité de version, démarrage applicatif et dépendances utiles selon son périmètre. Évitez les mutations réelles dans ce contrôle. Un résultat vert doit rester limité à ce qui a été observé et ne pas remplacer un test d’autorisation ou de restauration.
Erreur fréquente à comprendre
Un port ouvert prouve tout fonctionnement métier.
L’observation doit correspondre au contrat du service.
Coordonner le retour arrière avec les données
Remplacer le JAR par une version antérieure ne restaure pas automatiquement la base ou les messages déjà publiés. Une migration peut rendre l’ancien code incompatible avec l’état courant. Définissez compatibilité, procédure de reprise et critères d’acceptation avant la bascule. Un exercice doit employer des données représentatives et vérifier les invariants, plutôt que conclure à la réversibilité parce qu’un ancien fichier existe encore.
Erreur fréquente à comprendre
Remplacer le JAR restaure automatiquement toute base.
Les états persistants suivent un autre cycle.
Atelier guidé : lire, expliquer et vérifier le code
module lab.orders {
exports lab.orders.api;
} La déclaration de l’exercice exporte le package API du module. Elle organise l’accès prévu des consommateurs qui lisent le module, mais ne fournit pas à elle seule une ouverture générale de tous les membres privés à la réflexion profonde. Le nom du module et celui du package ont des rôles distincts, à vérifier dans un projet où le package existe réellement.
Créez un petit consommateur séparé et essayez un accès à une classe d’API puis à une classe d’implémentation non exportée. Si un outil de réflexion est nécessaire, définissez et testez l’ouverture ciblée correspondante. Construisez ensuite le livrable et lancez-le hors de l’IDE. Vous distinguerez ainsi encapsulation du code, résolution des dépendances et disponibilité effective des ressources au runtime.
Exemple commenté
module reservations.core {
exports com.example.reservations.api;
}
// Compilation depuis la racine du projet de laboratoire :
// javac --release 21 -d out $(find src -name "*.java")Le descripteur expose un package d’API et peut garder les implémentations internes non exportées. La commande commentée suppose une arborescence de laboratoire appropriée.
Exercice de mise en pratique
Découpez API, implémentation et application en modules puis testez un accès interdit à un package interne.
Voir une proposition de correction
Exportez seulement les types contractuels, déclarez requires côté consommateur et utilisez un service si l’implémentation doit être interchangeable. Vérifiez compilation et lancement du JAR hors IDE.
Points de vérification
- Distinguer exports et opens.
- Tester l’artefact dans un environnement propre.
- Observer les diagnostics de compilation.
Contrôle de connaissances
Cours associé : Modules, services, packaging et diagnostic ↗Validation du module
101 questions, objectif pédagogique de 75 %. Durée conseillée de 150 minutes, sans limite imposée. Les questions et les choix sont mélangés ; le corrigé apparaît après validation. Le contrôle rapide de la leçon et l’examen final du cours restent des exercices distincts.
Commencer ou reprendre les 101 questions →Cette marque suit votre propre avancement ; elle ne certifie pas la maîtrise du sujet. Effectuez l’exercice avant de passer à la suite.
