VT2016 Java9: Difference between revisions

From air
Jump to navigation Jump to search
 
(3 intermediate revisions by the same user not shown)
Line 88: Line 88:
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:
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:
[[File:dispo.png]]
[[File:dispo.png]]

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.

Latest revision as of 18:11, 3 November 2016

Présentation

  • Sujet: Java 9, Modules and Services
  • Auteur: Benjamin LUCIDARME
  • Enseignants: Didier DONSEZ, Georges-Pierre BONNEAU

Java9-281x300.jpg

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.

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: [1]

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

JavaFeature1.png JavaFeature2.png JavaFeature3.png

Nous allons en analyser quelques unes plus en profondeur.

Process API Update

  • 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.
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);
}
}
  • 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:
System.out.println("Your pid is " + Process.getCurrentPid());

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:

  • ê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.

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.

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.

Rt.png

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.
  • 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.

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.

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: Dispo.png

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.