Améliorations et changements apportés par Java 9
Java 9 : la suite
Java 9 est sortie en septembre 2017 trois ans aprés Java 8, cette version n'est pas encore largement utilisée en production, notamment à cause de son support non LTS (Long Term Support).
Dans mon article précédent, nous avons abordé les changements pour les développeurs, aujourd'hui nous parlerons des amélioratons d'architecture et des avancées apportés par Java 9.
Le nouveau système modulaire (AKA JIGSAW)
Le système de module introduit par java 9, permet de faciliter le packaging, de renforcer l'encapsulation du code et la gestion explicite des dépendances entre Libraires (JARs).
Lorsque le code applicatif grossit de plus en plus, il devient difficile de gérer les différentes dépendances entre Jars (et les versions) et s’assurer l’encapsulation du code.
Avant Java 9, une classe publique est accessible par toutes les autres classes publiques de la Classpath, on avait aucun moyen de gérer l'exposition de celle-ci afin de limiter son accès .
Avec les outils d'introspection, m'importe quel libraire présente dans la classpath pouvait accéder à ces classes publiques, cela peut notamment induire à des problèmes de sécurité par rapport à l’usage que certains APIs. ( accéder aux classes non autorisées et exécuter des méthodes avec la réflexion avec les effets de bord que cela pouvait impliquer).
La classpath Globale posait également un autre problème dans le sens qu'il est impossible de savoir si les Jar nécessaires à l'exécution de l'application sont présents. Et parfait on peut avoir des conflits entre classes qui viennent de plusieurs versions différentes.
Archive modulaire
Une Archive Jar modulaire contient un descripteur qui permet de décrire qui décrit les dépendances avec d'autre modules et les packages qu'elle expose vers les autres modules
Exemple
module tutoriels
exports org.wafr.commerce;
requires cms;
On peut noter :
- que seul les packages exportés par le module peuvent être visible par d'autres modules ce qui renforce la sécurisation de l’accès à certaines classes.
- La JDK qui est maintenant modulaire utilise cette fonctionnalité pour les classes internes encapsulées dans des modules pour usage interne.
- Pour démarrer une application, la JVM vérifie si les modules nécessaires (requires) sont disponibles dans la classpath.
Linking JEP 220
JLink est un outil qui permet d'assembler et d'optimiser un ensemble de modules et leurs dépendances dans un image personnalisée qui peut être utilisé un environnement d'exécution optimale d'une application données. Pour utiliser Jlink :
$ jlink --module-path <modulepath> --add-modules <modules> --limit-modules <modules> --output <path>
--module-path :chemin pour trouver les modules, ex peut être un fichier Jar modulaire, un fichier JMOD, ou une archive contenant d'autre Jar.
--add-modules : nom des modules à ajouter (les dépendances transitives sont également ajoutées).
--limit-modules : limiter l’univers des modules observés
--output : répertoire qui contiendra l'image optimisé crée.
Les options--module-path, --add-modules, and --limit-modules sont décrit dans la JEP 261.
Options supplémentaires:
--help : pour l'aide et les cas d'usage.
--version : pour connaitre la version.
JShell : REPL interactif
Jshell est une console qui permet de d'exécuter du code java en ligne de commande, cette fonctionnalité permet de faire des tests et d'explorer les API sans être obliger d'avoir un environnement de développement (IDE).
L'outil propose de l'auto-complétion en utilisant la touche Tab du clavier.
Maintenant plus besoin d'écrire une classe publique static void main(String[] args) pour lancer vos tests !!!! Les professeurs vont surement appréciés.
Interface avec une méthode privée
Avec Java 8, on peut créer et implémenter des méthodes par défaut dans une interface, mais que se passe t'il lorsqu’on veut factoriser du code ou par exemple créer des méthodes de type helper ?
Java 9 à introduit la possibilité de créer et d' implémenter aussi des méthodes privées dans une interface, évidemment les méthodes privées ne sont pas exposées par l’interface.
public interface Printer
// méthode normale
void printing();
// print normal
default void defaultPrinting() {
print();
// print with argument
default void printing(String arg)
print(arg);
// évidemment cette méthode ne sera pas exposée
private void print(String... arg)
System.out.println("iam private method"+arg);
}
Nouveau client HTTP/2
Java 9 a introduit une nouvelle façon de faire des appels HTTP qui supporte désormais les Web Sockets et le protocole http2 qui permet entre autres de manipuler des Streams et les push serveurs.
Exemple :
public static void main(String[] args)
try {
HttpClient client = HttpClient.newHttpClient();
HttpRequest req = HttpRequest.newBuilder(URI.create("https://www.linkeddin.com")).header("User-Agent", "Java").GET()
.build();
HttpResponse<String> resp = client.send(req, HttpResponse.BodyHandler.asString());
catch (IOException e)
// TODO Auto-generated catch block
e.printStackTrace();
catch (InterruptedException e)
// TODO Auto-generated catch block
e.printStackTrace();
}
Pour tester il faut inclure le module httpclient avec l'option ci-dessous dans les paramètres de VM
--add-modules jdk.incubator.httpclient
Ou créer un module dans le fichier module-info.java dans votre projet
module java9samples
exports org.wafr;
requires java.desktop;
requires jdk.incubator.httpclient;
Multi-release JARS
Permet de créer des versions alternatives d'une classe qui sera seulement utilisé pour une version spécifique de java. Cette fonctionnalité est particulièrement intéressante pour gérer les problèmes de rétrocompatibilité entre versions. Ainsi pour une classe donnée, on pourrait définir la version de java sur laquelle elle va être utilisé.
Pour plus d'information je vous invite à lire cet article: https://blog.codefx.org/tools/multi-release-jars-multiple-java-versions/
Si cette article vous a plu n'hésitez pas à laisser des commentaires.