VT2016 Java9

= Présentation = = Résumé = Aujourd’hui plus de 9 millions de développeurs à travers le monde utilisent java, ce qui fait de lui une des premières plateformes de développement. En juillet 2017, une nouvelle version de Java sera disponible, 3 ans après Java 1.8. Quasiment 90 modifications ont été annoncé afin d'offrir aux développeurs plus de simplicité et de possibilités. Parmi toutes ces nouveautés, Oracle a annoncé l'intégration de Jigsaw à Java 9.
 * Sujet: Java 9, Modules and Services
 * Auteur: Benjamin LUCIDARME
 * Enseignants: Didier DONSEZ, Georges-Pierre BONNEAU

= Abstract =

Today more than 9 million developers worldwide use Java, which makes him one of the first development platforms. In July 2017, a new version of Java will be available 3 years after Java 1.8. Nearly 90 amendments were announced in order to provide developers with greater simplicity and opportunity. Among these innovations, Oracle announced the integration of Jigsaw in Java 9.

= Synthèse =

Toutes les nouveautés
Toutes les nouveautés présentes dans Java 9 sont présentés à ce lien: 

Vous pouvez également les consulter rapidement sur les photos ci-dessous:



Nous allons en analyser quelques unes plus en profondeur.

Process API Update
public static void main(String[] args) throws Exception { Process proc = Runtime.getRuntime.exec(new String[]{ "/bin/sh", "-c", "echo $PPID" }); if (proc.waitFor == 0) { InputStream in = proc.getInputStream; int available = in.available; byte[] outputBytes = new byte[available]; in.read(outputBytes); String pid = new String(outputBytes); System.out.println("Your pid is " + pid); } }
 * Pour commencer, je vous présente la mise à jour de l’API Process. Cet API est utile pour contrôler le processus et obtenir des informations sur celui-ci. Dans java 1.8, pour obtenir l’identifiant du processus par exemple, il est nécessaire d’exécuter le code suivant.

System.out.println("Your pid is " + Process.getCurrentPid);
 * Grace à l’udapte de l’API, des fonctions permettant d’obtenir des informations serons inscrites en static et donc accessible depuis n’importe ou. Une seule ligne suffit donc:

Money API

 * Voici un tout nouveau module qui arrivera dans java 9. Ce module a déjà été réalisé, et il est disponible sur Github, vous pouvez déjà l’utiliser, à condition de l’importer dans votre projet. Ce module permet de gérer les différents format de monnaie rapidement. Voici un exemple d'utilisation:

Money money= Money.of(10.12345, "USD"); MonetaryAmountFormat germanFormat = MonetaryFormats.getAmountFormat(Locale.GERMANY); System.out.println(germanFormat.format(money));


 * Lorsque java 9 sera sorti, il ne sera donc plus nécessaire de l’importer et de le compiler, puisque il sera intégré directement dans le compilateur.

Datagram Transport Layer Security
Ce module est une nouvelle API. Java 9 sera donc accompagné de la version 1.0 de ce module. Ce module fournit une sécurisation des échanges basés sur des protocoles en mode datagramme. Ce protocole, nommé par DTLS, fournit des sécurités similaires au protocole TLS, le successeur du SSL. Ce nouveau module permettra donc de sécuriser de la même manière des transferts de données en TCP, grâce à TLS, qu’en UDP, grâce à DTLS.

HTTP2 Client
Encore une fois, ceci est une nouvelle API. Elle est destinée à permettre d’utiliser le protocole HTTP 2 et remplacer l’API actuel, HttpUrlConnection. Les buts complémentaires de cet API sont: Aujourd’hui, il est déjà possible d’utiliser ce protocole HTTP2 en java, à condition d’utiliser le plugin Jetty, qui lui gère, entre autre, HTTP2.
 * être simple d’utilisation pour les cas courants
 * la sécurité doit être renforcé par rapport à l’API précédente
 * l'API doit supporter les protocoles TLS et DTLS, que je vous ai présenté juste avant.

HTML5 Javadoc
La javadoc est, jusqu’à présent, affiché en HTML 4. Cela va changer avec java 9, et elle sera affiché en HTML 5. Cependant la structure reste la même, avec l’arbre des classes. Le code HTML 5 généré va également clairement séparer le style et le contenu.

Jigsaw
Et enfin, vous l’attendiez tous, le projet Jigsaw. En tous cas, si vous ne l’attendiez pas, beaucoup de développer l’attendais, depuis plus de 9 ans. L’objectif de Jigsaw est d’aboutir à une plateforme Java modulaire. Initialement prévu pour Java 7, puis java 8, Jigsaw verra le jour finalement avec Java 9.
 * Aujourd’hui, le JDK est devenu très imposant et gourmand en thermes ressources. En effet, rien que rt.jar, le jar runtime, pèse plus de 60 Mo.

De plus, certain packages internes sont appelés par des API, alors qu’ils ne devraient pas l’être. Les bibliothèques et les frameworks du marché sont fortement dépendants du rt.jar et du tools.jar.


 * La modularité permet de simplifier ces dépendances, et de compiler seulement ce dont on a besoin. Il rend Java plus évolutif et flexible, tout en améliorant la sécurité, la maintenabilité et la performance.

Pour compiler ces modules, oubliez le classpath, il y a un nouveau paramètre module-path (ou -p) disponible avec la commande javac / java. Sa valeur contient un ou plusieurs répertoires qui contiennent les modules nécessaires pour compiler / exécuter votre application.
 * Qu’est-ce qu’un module ? Un module c’est du code natif, des ressources ainsi qu’un fichier de configuration. Ce fichier s’appelle module-info.java.

= Démonstration =

Pour la démonstration, nous allons exécuter un petit projet Jigsaw composé de deux modules. NOus pouvons observer la disposition des deux modules ci-dessous:

La fonction Main est dans le module "MoreThanTen". package com.lucidarme.morethanten.api; import com.lucidarme.morethanten.internal.StringCheckerImpl; public class Run { public static void main(String[] args) { String argument = args[0]; boolean isMoreThanTen = new StringCheckerImpl.checkMoreThanTen(argument.length); if(isMoreThanTen){ System.out.println(argument + " contient plus que 10 charactères"); } else { System.out.println(argument + " contient moins de 10 charactères"); }   } }

Dans cette fonction, nous faisons appel à la classe StringCheckerImpl, qui est dans le même module, mais pas dans le même package:

package com.lucidarme.morethanten.internal; import com.lucidarme.morethanten.api.StringChecker; import com.lucidarme.checklengthstring.api.LengthStringValidatorFactory; public class StringCheckerImpl implements StringChecker { @Override public boolean checkMoreThanTen(int stringLength) { return LengthStringValidatorFactory.getInstance.lengthStringIsMoreThanTen(stringLength); } }

Cette dernière fait également reference à une classe, LengthStringValidatorFactory, qui est dans l'autre module. Pour avoir accés à l'autre module, nous allons devoir le déclarer dans le fichier module-info.java.

module com.lucidarme.morethanten{ requires com.lucidarme.checklengthstring; }

Cependant, tant que rien n'est déclaré "exportable" dans le second module, nous ne pouvons avoir accés à com.lucidarme.checklengthstring. Il faut donc implementer module-info.java dans le second module de la sorte:

module com.lucidarme.checklengthstring{ exports com.lucidarme.checklengthstring.api; }

Ainsi, nous explicitons le fait que les classes présentent dans le package com.lucidarme.checklengthstring.api sont public et utilisables par n'importe quel autre module.