Java 9, Jigsaw et ses modules

Le classpath est mort. Vive le module-path !

Après de nombreux rebondissements et une longue maturation, Jigsaw et ses modules arrivent avec Java 9, sorti le 21 septembre 2017. Regardons de quoi il s’agit.

 

Les modules arrivent avec plusieurs buts

 

  • Réduire la taille des applications (IoT, Cloud)

Le coût du stockage a beau fortement chuter, l’internet des objets et le cloud sont des domaines où les applications sont de plus en plus dupliquées. Les objets connectés contiennent chacun leurs applications, et le cloud s’appuie dans de nombreux cas sur le multi-instance. Dans ces domaines, le stockage a donc encore de l’importance.

  • Renforcer la sécurité

Dans une application Java (≤ 8), une faille suffit souvent à accéder à toutes les API d’une application et de ses librairies, grâce à la réflexion.

  • Rénover le classpath

Aujourd’hui, une application Java tourne en moyenne avec une centaine de jar, tous au même niveau. La recherche d’une classe, qui se fait de façon linéaire jar après jar, n’est pas très rapide.

Les modules de Java 9 ont pour ambition d’adresser ces problématiques.

 

Comment mettre en place les modules

 

Les modules enrichissent le jar, en y précisant ses dépendances, et la visibilité de ses packages. Concrètement, un module se configure grâce à une classe nommée module-info.java :

Cette configuration explicite le fait que notre module fait appel au module spring.boot, et qu’il expose les classes situées dans son package fr.sii.blog.jigsaw.externalapi de notre module.

Si des dépendances nécessaires (requires) à notre module manquent, l’application ne démarrera pas.

Côté visibilité, toutes les classes en dehors du package fr.sii.blog.jigsaw.externalapi seront inaccessibles aux autres modules utilisant notre module fr.sii.blog.jigsaw

 

Par convention, le code source doit désormais respecter une arborescence légèrement modifiée, un répertoire est ajouté entre /src/ et le premier répertoire du reverse dns de notre application :

Le fichier module-info.java se place à la racine du répertoire fr.sii.blog.jigsaw

Par défaut, la réflexion sur les classes des autres modules est interdite et provoque l’exception InaccessibleObjectException.

 

Comment migrer et modulariser son application ?

 

Le plus simple est bien sûr de démarrer son projet sous java 9 pour profiter des modules. Pour les applications existantes, une migration en plusieurs étapes est prévue.

Oracle, fidèle à sa bonne compatibilité ascendante sur Java, a bien conscience que la migration vers les modules prendra du temps. Le classpath n’est pas mort (mais alors le sous-titre de cet article ment !), et il cohabite avec le module-path. Il est donc possible de ne pas modulariser son application, même en utilisant des librairies modularisées. En effet, les jar du classpath peuvent voir tous les modules, mais l’inverse n’est pas vrai. Heureusement ! Car le jdk9 a été entièrement modularisé.

A l’inverse, pour utiliser une librairie non-modularisée dans une application modularisée, Jigsaw propose les modules automatiques.

Concernant les restrictions sur la réflexion entre module, des options permettent d’autoriser la réflexion de manière fine (opens) ou globale (illegal-access).

L’outil jdeps aide à la modularisation en fournissant de précieuses indications sur les dépendances de notre application et donne des pistes pour le travail à effectuer.

 

Alors, Jigsaw, les objectifs sont-ils atteints ?

 

  • Concernant le stockage, nous pouvons utiliser l’outil jlink qui optimise et assemble un ensemble de modules, pour ne garder que les modules utilisés, même pour ceux du jdk.
  • Côté sécurité, les restrictions sur la réflexion ajoute de la sécurité en compliquant la propagation d’une faille d’un module à un autre.
  • Enfin la déclaration des dépendances de chacun des modules accélère la localisation des classes.

 

Merci à Rémi Forax, expert lors du JCP (Java Community Process) sur Jigsaw, pour son breizhjug.

Laisser un commentaire

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

20 + 9 =