Améliorations et changements apportés par Java 9

plus de 4 an(s)

Description

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.