SlideShare une entreprise Scribd logo
1  sur  66
Télécharger pour lire hors ligne
#DevoxxFR #ApresJava8 1
Après Java 8,
Java 9 et 10
Jean-Michel Doudoux
@jmdoudoux
#DevoxxFR #ApresJava9
Java 8
2
Les expressions lambdas
références de méthodes
Approche fonctionnelle :
l’API Stream + Collector
Les interfaces : les méthodes
statiques et par défaut
L’API Date & Time
CompletableFuture
Optional
Permgen -> Metaspace
…
#DevoxxFR #ApresJava9
Java 8
3
Made Java great again ?
TIOBE : langage de l’année en 2005 et en 2015
Un engouement certain
constaté par la popularité de Java 8
Diffusé en mars 2014
#DevoxxFR #ApresJava9 4
Sûrement la version la plus controversée
Première fois que l’EC du JCP vote Non
Diffusé en septembre 2017
2 updates : 9.0.1, 9.0.4
Introduit des changements majeurs
Tout en tentant d’offrir une certaine compatibilité
Java 9
#DevoxxFR #ApresJava9
Java 9 : les fonctionnalités
5
API
Fabriques pour des collections immuables
Process API
Reactive Streams (Flow API)
Var Handles
…
Le système de modules (JPMS) issu du projet Jigsaw
Introduit une rupture
Avec un mode de compatibilité, pour faciliter la migration
Evolutions mineures dans le langage
Outils
JShell
Jlink pour créer des runtime compacts
Recherche dans la Javadoc en HTML 5
Jdeprscan
…
JVM
G1 est le ramasse-miettes par défaut
Réduction de la taille mémoire (Compact Strings)
Amélioration de la performance et de la sécurité
Multi-Release Jar
…
+ 89 JEPs
#DevoxxFR #ApresJava9
Nouveau modèle de releases
6
LTS : le nouveau modèle de support (Oracle JDK)
Version tous les 3 ans à partir de Java 11
Pour les clients
2 releases majeures de Java par an (OpenJDK) :
en mars et septembre
Les deux releases suivantes après Java 9 :
Java 10 en mars 2018
Java 11 en septembre 2018
Java 9 n’est pas LTS
Ni Java 10
#DevoxxFR #ApresJava9
Java 10
7
12 JEPs
1 utile pour les développeurs
+ évolutions dans les API existantes
6 mois après Java 9, release de Java 10
Diffusé le 20 mars 2018
2 conséquences :
2) Java 9 quasiment pas utilisé
Mais déjà obsolète avec la sortie de Java 10
1) Durée de release réduite -> nombre de fonctionnalités réduites
#DevoxxFR #ApresJava9
Jean-Michel Doudoux
8
http://www.jmdoudoux.fr
@jmdoudoux
Co-fondateur du , membre du
Auteur de 2 didacticiels
Diffusés sous licence GNU FDL
• Développons en Java (3400 pages)
• Développons en Java avec Eclipse
CTO et
#DevoxxFR #ApresJava9
Roadmap
9
• Les a priori sur Java 9
• Les avantages de Java 9
• Faire un état des lieux avant migration
• La migration vers Java 9 : les stratégies
• Des fonctionnalités pour faciliter la migration
• Les difficultés
• Java 10
#DevoxxFR #ApresJava9 10
Les a priori
sur Java 9
#DevoxxFR #ApresJava9
Mythes et réalités
11
Le classpath est remplacé par le module-path
Le code de l’application doit être modularisé
sun.misc.Unsafe est retiré
NON
NON
NON
Une application Java 8 s’exécute en Java 9
La majorité du code existant n'aura pas besoin d'être modifié
Une application Java 8 compile en Java 9 Ça depend
Ça depend
OUI
#DevoxxFR #ApresJava9 12
Les avantages
de Java 9
#DevoxxFR #ApresJava9
Améliorations de la syntaxe
13
Méthodes private dans les interfaces
Opérateur diamant dans les classes anonymes internes
Variables effectivement finales dans try with ressources
@SafeVarags sur les méthodes d’instances private
#DevoxxFR #ApresJava9
API et outils
14
Fabriques pour collection immuable
JShell : un outil de type REPL
Process API
Flow API (Reactive Stream)
Var Handles
JavaDoc en HTML 5 avec recherche
Enrichissement de CompletableFuture
#DevoxxFR #ApresJava9
Améliorations de la JVM
15
Globalement de meilleures performances
Segmented code Cache
G1 comme GC par défaut
Concaténation des chaînes avec InvokeDynamic
Compact String
Unified JVM Logging
Unified GC Logging
#DevoxxFR #ApresJava9
Les modules
16
Sont perçus comme contraignants
Exemple de contraintes :
plus d’accès par défaut aux classes public d’un module
plus d’introspection par défaut sur les classes d’un module
plus de split packages
plus de dépendances circulaires
La nécessité de définir les dépendances dans les module-info ET les outils de build
…
 moins de liberté
utilisée pendant plus de 20 ans
parfois avec abus
Tous les systèmes de modules sont contraignants
#DevoxxFR #ApresJava9
Les modules
17
Mais on doit profiter des avantages des modules
L’occasion de remettre de l’ordre :
dans le design des livrables
dans les dépendances
dans les API utilisées (notamment celles non supportées du JDK)
Une configuration fiable
Réduire les problèmes du classpath hell
L’encapsulation forte
Améliorer la sécurité et la maintenabilité
#DevoxxFR #ApresJava9
4 types de modules
18
App Named modules Jar modulaire dans le module path
Automatic modules Jar non modulaire dans le module path
Nom extrait de MANIFEST.MF ou dérivé du nom du jar
Tous les packages sont exposés
Peuvent accéder à tous les autres modules
Pont entre named modules et unnamed module
Unnamed module Un seul module
classes, jars modulaires ou non dans le class path
tous les packages sont exposés
Peut accéder à tous les autres modules
Platform modules Modules du JRE
#DevoxxFR #ApresJava9
Runtime personnalisé
19
Outil jlink (Java Linker)
Pour créer un JRE personnalisé
Ne contenant que le nécessaire pour l’exécution d’une application
Deployer facilement une application
Sans s’appuyer sur un JRE pré-installé
Tous les jars doivent être modulaires
Uniquement des named modules (pas d’automatic modules)
Incluant TOUTES les dépendances
#DevoxxFR #ApresJava9 20
Faire un état
des lieux
#DevoxxFR #ApresJava9
Utilité
21
Recenser les différents points à prendre en compte
 Aider à choisir la stratégie de migration
 Avoir une meilleure visibilité sur l’ampleur de la tâche
Faire une cartographie des dépendances
Vérifier pour chacune si une version modulaire existe
En profiter pour faire du ménage
Et prévoir des upgrades
Utiliser l’outil jdeps pour obtenir des informations
#DevoxxFR #ApresJava9
jdeps
22
Fournit dans le JDK depuis Java 8, amélioré en Java 9
Analyse statique du bytecode pour déterminer les dépendances
Travaille sur les .class ou .jar
A passer sur l’application
mais aussi sur toutes les dépendances
Pour obtenir de nombreuses informations :
Des dépendances
Les split packages
Les API du JDK qui ne sont plus accessibles
#DevoxxFR #ApresJava9
jdeps
23
Dépendances agrégées au niveau des packages ou des jars
Possibilité de filtrage
Différents formats de restitution
dont des fichiers .dot
Par défaut affiche :
les modules du JDK requis
les dépendances de chaque packages
<package> -> <package> <module/JAR>
#DevoxxFR #ApresJava9
Les options de jdeps
24
Nombreuses options : -h pour l’intégralité
jdeps --class-path 'libs/*' -recursive monapp-3.2.jar
Option Rôle
--class-path ou -cp définir les dépendances dans le classpath
--module-path définir les dépendances dans le module path
-recursive ou –R parcours récursif des dépendances
--package ou –P seulement les dépendances vers un package
--dot-ouput créer des fichiers .dot par jar utilisable avec GraphViz
-verbose:class dépendances entre classes
--summary ou –s afficher un résumé des dépendances
--generate-module-info générer le fichier module-info.java
--generate-open-info générer le fichier module-info.java pour un module open
--jdk-internals ou -jdkinternals trouver les API internes utilisées
#DevoxxFR #ApresJava9 25
La migration
vers Java 9
#DevoxxFR #ApresJava9
Migrer une bibliothèque
26
Deux stratégies :
Sans conversion en module
Il faut absolument figer le nom du module
avec l’attribut Automatic-Module-Name dans le fichier MANIFEST.MF
Sinon le nom du module est déterminé à partir du nom du jar -> automatic module
Ne DOIT pas changer lors de la modularisation
La conversion en module d’un jar
Ajout d’un fichier module-info
fixe le nom du module et les dépendances
Permet son utilisation dans le module-path
et donc de le déclarer comme dépendance d’un autre module
Permet toujours son utilisation via le classpath
Toujours tester dans le classpath et le module path
#DevoxxFR #ApresJava9
Migration d’une application
27
Différentes stratégies :
Pas de migration
Migration vers une autre techno
Attente de la prochaine LTS
Migration vers les modules
Avec prise en compte du nouveau modèle de release
Migration sans les modules
Migration incrémentale
#DevoxxFR #ApresJava9
Pas de migration
28
Il y a encore (de rares) applications qui tournent en Java 4/5 (2004)
Attention : plus de mises à jour gratuites du JRE
Pour profiter des corections, des nouvelles fonctionnalités dans la JVM
Et surtout plus de mises à jour relatives à la sécurité (cf GDPR)
et/ou la performance
Un peu plus en Java 6 (2006) et beaucoup en Java 7 (2011)
Pas de migration = rester en Java 8
Plus de support gratuit d’Oracle à partir de janvier 2019 (grâce à une extension d’Oracle)
Grosses difficultés / impossibilité d’upgrader les dépendances
#DevoxxFR #ApresJava9
Migration vers autre techno
29
Coût de réécriture et de test
surtout pour de grosses applications
Quel est le R.O.I. pour le back end ?
Choix de la techno ?
Php / ROR
.Net
JavaScript / Node.JS
Smalltalk
Scala, Kotlin
….
#DevoxxFR #ApresJava9
Attente de la prochaine LTS
30
Stratégie viable
puisque cela laisserait entre 2 et 3 ans pour migrer
Vrai, sans le nouveau modèle de releases
La prochaine version LTS : Java 11 (25 septembre 2018)
Le support public de Java 8 est étendu à janvier 2019
2020 pour un usage personnel
http://www.oracle.com/technetwork/java/eol-135779.html
#DevoxxFR #ApresJava9
Mises à jour gratuites ou support payant ?
31
LTS : support (non gratuit) longue durée proposé par Oracle
Selon plusieurs niveaux
Article de Simon Ritter d’Azul System
https://www.azul.com/java-stable-secure-free-choose-two-three/
Le nouveau modèle de release remet en cause
Les longues périodes de maj gratuites appliquées jusqu’ici
Entre deux versions de Java (2 à 4 ans) + 1 an d’extension
Période de mises à jour gratuites très courte
Uniquement jusqu’à la prochaine feature release (6 mois)
Exemple : plus de support gratuit pour Java 9
#DevoxxFR #ApresJava9
Migrer vers les modules
32
LA solution cible
qui ne repose que sur des modules
N’utilise que des modules :
Plateform modules (JRE)
Et named modules (applications et toutes les dépendances)
Ajouter un module-info à chaque jar
Tenir compte de certaines contraintes et difficultés
Souvent compliqué et parfois impossible directement
Notamment à cause des dépendances (en particulier les transitives)
#DevoxxFR #ApresJava9
Migrer sans les modules
33
Il est possible de n’utiliser que le classpath
Comme avant Java 9
Attention :
le JRE est modulaire
Permet une exécution en Java 9,
généralement non sans certaines adaptations
Prendre en compte certaines contraintes
#DevoxxFR #ApresJava9
Migration incrémentale
34
Le JDK est modulaire
L’application peut être modularisée (partiellement ou intégralement)
ou pas
Les dépendances ne sont pas toutes modulaires
Certains modules peuvent coopérer avec les jars non modulaires
=> Nécessité de cohabitation entre jars modulaires et non modulaires
#DevoxxFR #ApresJava9
Migration incrémentale
35
Plusieurs fonctionnalités facilitent cette cohabitation :
L’option --illegal-access par défaut à permit
Les options pour assouplir les règles de JPMS
Multi-Release JAR
Facilitée par la coexistence du classpath et du module path
=> Migration incrémentale sera généralement la stratégie utilisée
#DevoxxFR #ApresJava9 36
Des fonctionnalités pour
faciliter la migration
#DevoxxFR #ApresJava9
Classpath et module path
37
Peuvent être utilisés en simultané
Jars non modulaires et modulaires peuvent être mis dans l’un ou l’autre
Implique des contraintes d’utilisation
Classpath Module path
Jar standard
Unnamed module
Automatic module
Jar modulaire Application named module
#DevoxxFR #ApresJava9
Un jar est il modulaire ?
38
Utiliser l’option --describe-module ou –d de l’outil jar
C:java>jar --file monutil-1.1.jar -d
Descripteur de module introuvable. Module automatique dérivé.
monutil automatic
requires java.base mandated
contains com.oxiane.app.util
C:java>jar -d --file com.oxiane.app.main-1.0.jar
com.oxiane.app.main jar:file:///com.oxiane.app.main.jar/!module-info.class
exports com.oxiane.app.main
requires com.oxiane.app.util
requires java.base mandated
contains com.oxiane.app.common
#DevoxxFR #ApresJava9
Accès entre modules
39
Unnamed
…
xxx.jar
yyy.jar
zzz.jar
Classpath Module Path JDK
Platform
…
java.base
java.xml java.logging
Automatic
aaa.jar
bbb.jar
ccc.jar
App named
com.www.jar
com.xxx.jar
com.yyy.jar
java.sql
expliciteimplicite
com.zzz.jar
#DevoxxFR #ApresJava9
L’option --illegal-access
40
Solution temporaire qui sera changée dans une future version
La valeur par défaut sera alors deny
Autoriser ou non les accès par introspection
par le unnamed module
Fait perdre une partie des bénéfices de JPMS
Mais permet d’ exécuter plus facilement une application en Java 9
permit affiche un warning à chaque premier accès illégal
Ne pas ignorer ces warnings
Valeur par défaut : permit
qui autorise tous les accès
#DevoxxFR #ApresJava9
L’option --illegal-access
41
Autres valeurs possibles :
warning :
Warning à chaque accès
debug :
Warning + informations complémentaires
deny :
Interdire tous les accès
Permet d’anticiper sur le futur
#DevoxxFR #ApresJava9
Les options pour assouplir JPMS
42
JPMS est très strict
Parfois bien utile (voire nécessaire) dans certains cas,
Mais il ne faut pas abuser de leur utilisation
--add-module ajouter des modules au graphe
--add-reads permettre à un module d’accéder à un autre
--add-exports exporter un package d’un module
--patch-module ajouter des classes à un module
--add-opens : permettre un accès par introspection à un package
5 options (javac et jvm) permettent des assouplissements :
Elles ne modifient pas le module-info
#DevoxxFR #ApresJava9
Multi-Release JAR (MR JAR)
43
Etendre le format jar
pour inclure des versions spécifiques de .class pour d’autres versions de Java
dans un même fichier jar
Racine du fichier jar
MaClasse.class
META-INF
MANIFEST.MF
versions
9
MaClasse.class
10
MaClasse.class
Un jar peut contenir plusieurs .class pour différentes versions
La version courante à la racine
Les autres versions (>=9), dans META-INF/versions/N
Multi-Release: true dans MANIFEST.MF
Support à partir de Java 9
#DevoxxFR #ApresJava9
jdeprscan
44
Nouvel outil de Java 9
Analyse statique des .class pour rechercher les API deprecated
On n’y est pas habitué
Il y a des API deprecated depuis Java 1.1
Notamment les API deprecated for removal
Important car elles seront retirées
Dans un futur plus ou proche
jdeprscan xxx-3.0.7.jar
Jar file xxx-3.0.7.jar:
class xx/xxx/XxxxXxx uses deprecated class javax/security/cert/X509Certificate
class xx/xxx/XxxxXxx uses deprecated method java/lang/Object::finalize()V
class xx/xxx/XxxxXxx$1 overrides deprecated method java/lang/Object::finalize()V
class xx/xxx/XxxxXxx uses deprecated class javax/security/cert/CertificateException
#DevoxxFR #ApresJava9 45
Les difficultés
#DevoxxFR #ApresJava9
Les incompatibilités
46
L’identifiant _ n’est plus valide
Alignement de la structure des répertoires du JDK et JRE
Fonctionnalités de la JVM retirée
Les fichiers rt.jar et tools.jar
Le mécanisme d’extension
Le mécanisme endorsed
#DevoxxFR #ApresJava9
Les API internes
47
La plupart des API internes sont encapsulées
et ne sont donc plus accessibles
Ces API sont non standard / non supportées
Elles n’auraient jamais dû être utilisées
Certaines sont remplacées
Ex : sun.misc.BASE64Decoder
Certaines sont encore accessibles
En attendant leur remplacement
Ex : sun.misc.Unsafe (partiellement remplacée par Var Handles)
#DevoxxFR #ApresJava9
Les API internes
48
Utiliser jdeps avec l’option --jdkinternals
MaClasse.class -> JDK removed internal API
MaClasse -> sun.misc.BASE64Encoder JDK internal API (JDK removed internal API)
JDK Internal API Suggested Replacement
---------------- ---------------------
sun.misc.BASE64Encoder Use java.util.Base64 @since 1.8
Utiliser --illegal-access=deny pour simuler le futur
#DevoxxFR #ApresJava9
Les dépendances cycliques
49
Des jars non modulaires peuvent avoir des dépendances cycliques
Ce n’est pas une bonne pratique
Mais c’est courant dans le classpath
Cela peut donc compliquer la migration
Les modules NE peuvent PAS avoir de dépendances cycliques
A la compilation ou à l’exécution
#DevoxxFR #ApresJava9
Split packages
50
Packages présents dans plusieurs jars
Pour des raisons de compatibilité :
les split packages sont autorisés dans l’unnamed module
Java 9 interdit les split packages
Pour assurer la fiabilité de la configuration
S’applique pour les packages dans les modules
des modules exportés ou NON
Courant dans le classpath
#DevoxxFR #ApresJava9
Nouveau format de version
La version est parfois utilisée pour de mauvaises raisons
Solution :
Utiliser l’API Runtime.Version
Utiliser MR JAR
Le format de version change de nouveau en Java 10
Rechercher du code qui parse le numéro de version
Pas évident car aucune API standard
Le format de la version de Java 9 change
#DevoxxFR #ApresJava9
Les modules Java EE
52
Les modules Java EE ne sont pas résolus par défaut
JAX-B, JAX-WS, JavaBeans Activation Framework, JTA, Commons annotations, CORBA
• java.activation (JAF)
• java.corba (CORBA)
• java.transaction (JTA)
• java.xml.bind (JAX-B)
• java.xml.ws (JAX-WS et SAAJ)
• java.xml.ws.annotation (Commons annotations)
Le module java.se.ee regroupe ces 6 modules
Plus 2 modules du JDK
• jdk.xml.ws (outils pour JAX-WS : wsgen, wsimport)
• jdk.xml.bind (outils pour JAXB : xjc, schemagen)
Ils sont deprecated for removal en Java 9
#DevoxxFR #ApresJava9
Les modules Java EE
53
Ou de préférence, utiliser une tierce dépendance
Utiliser l’option --add-modules <module>(,<module>)*
JAF Automatic-Module-Name: java.activation
<groupId>javax.activation</groupId>
<artifactId>javax.activation-api</artifactId>
<version>1.2.0</version>
JTA
<groupId>javax.transaction</groupId>
<artifactId>javax.transaction-api</artifactId>
<version>1.3</version>
JAXB nom du module java.xml.bind
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.0</version>
JAX-WS
<groupId>com.sun.xml.ws</groupId>
<artifactId>jaxws-ri</artifactId>
<version>2.3.0</version>
<type>pom</type>
CORBA
???
Seule solution à partir de Java 11
La JEP 320 (Remove the Java EE and CORBA Modules) est intégrée
Common annotations Automatic-Module-Name:
java.annotation
<groupId>javax.annotation</groupId>
<artifactId>javax.annotation-api</artifactId>
<version>1.3.1</version>
#DevoxxFR #ApresJava9
Les dépendances optionnelles
54
Dépendances utilisées à l’exécution uniquement si présente
Exemple : une implémentation d’un cache
Solution 2 :
Utiliser un service pour découpler consommateur et fournisseur
Fournisseur :
provides xxx with yyy dans le module-info
Consommateur :
uses xxx dans le module-info
Utiliser l’API ServiceLoader pour charger la classe
Solution 1 :
requires static dans le module-info
Utiliser l’introspection pour créer des instances de manière défensive
#DevoxxFR #ApresJava9 55
Java 10
#DevoxxFR #ApresJava9
Java 10
56
Java 10 repose sur Java 9
Avec des corrections et évolutions mineures
12 JEPs :
286: Local-Variable Type Inference
304: Garbage-Collector Interface
307: Parallel Full GC for G1
310: Application Class-Data Sharing
312: Thread-Local Handshakes
319: Root Certificates
296: Consolidate the JDK Forest into a Single Repository
313: Remove the Native-Header Generation Tool (javah)
314: Additional Unicode Language-Tag Extensions
316: Heap Allocation on Alternative Memory Devices
317: Experimental Java-Based JIT Compiler
322: Time-Based Release Versioning
Une release tous les 6 mois -> une release plus petite
#DevoxxFR #ApresJava9
L’inférence de type des variables locales
57
Depuis Java 7, l’inférence de type est de plus en plus utilisée
Avec Java 10 : pour faciliter la déclaration de variables locales
var i = 2; // int
var j = 2L; // long
var var = "Bonjour"; // String
var references = new HashMap<Integer,String>(); // HashMap<Integer,String>
var chemin = Paths.get("fichier.txt"); // Path
var contenu = Files.readAllBytes(chemin); // byte[]
var objet = new Serializable() {} ; // MaClasse$1
var est utilisable dans les boucles et try with resources
for (var i = 0; i < 10; i++) { ... }
for (var arg : args) { ... }
try (var file = new FileInputStream(new File("monfichier.txt"))) { ... }
Avec l’instruction var
Qui n’est pas un mot clé
#DevoxxFR #ApresJava9
L’inférence de type des variables locales
58
Plusieurs situations sont illicites
var valeur; // cannot use 'var' on variable without initializer
var obj = null; // variable initializer is 'null'
var a=1, b=2; // 'var' is not allowed in a compound declaration
// var a=1; var b=2;
var chaines = {"e1","e2"}; // array initializer needs an explicit target-type
// var chaines = new String[] {"e1","e2"};
var additionner = (a,b) -> a+b; // lambda expression needs an explicit target-type
// var additionner = (IntBinaryOperator) (a,b) -> a+b
var comparerStr = String::compareTo; // method reference needs an explicit target-type
// var comparerStr = (Comparator<String>) String::compareTo
var valeur = 10;
valeur = "bonjour"; // incompatible types: String cannot be converted to int
// Java n’est pas Javascript et reste statiquement typé
Incompatibilité
jshell> class var {}
| Error:
| 'var' not allowed here
| as of release 10, 'var' is a restricted local variable type and cannot be used for type
declarations
#DevoxxFR #ApresJava9
L’inférence de type des variables locales
59
Utiliser var avec discernement
le code peut être plus ou moins lisible (surtout sans IDE)
Importance accrue du nom des variables
l’abstraction est limitée : pas d’inférence vers un super type ou une interface
le type inféré est ArrayList<String>
List<String> aurait été préférable
jshell> var liste = new ArrayList<String>();
liste ==> []
jshell> liste.trimToSize()
jshell>
jshell> List<String> liste2 = new ArrayList<>();
liste2 ==> []
jshell> liste2.trimToSize()
| Error:
| cannot find symbol
| symbol: method trimToSize()
| liste2.trimToSize()
| ^---------------^
#DevoxxFR #ApresJava9
Mises à jour des API
60
Optional, OptionalInt, OptionalLong, OptionalDouble
orElseThrow() : alternative à get()
java.util.stream.Collectors
toUnmodifiableList()
toUnmodifiableSet()
toUnmodifiableMap(Function, Function)
toUnmodifiableMap(Function, Function, BinaryOperator)
List, Set, Map
static copyOf(Collection) : copie immuable de la collection
#DevoxxFR #ApresJava9
Support de Docker
61
Java 10 : Meilleur support des conteneurs Docker
JDK-8189497 et JDK-8186315, JDK-8179498, JDK-8186248, JDK-8146115
Option UseContainerSupport (Linux uniquement)
activée par défaut, -XX:-UseContainerSupport pour désactiver
Extraction d’informations du conteneur (cgroup)
nombre de CPU alloué au conteneur
mémoire allouée au conteneur
Détection de l’exécution dans un conteneur
#DevoxxFR #ApresJava9
Support de Docker
62
Java 8u131 et Java 9
-XX:+UnlockExperimentalVMOptions (Linux uniquement)
-XX:+UseCGroupMemoryLimitForHeap (Linux uniquement)
-XX:InitialRAMFraction, -XX:MaxRAMFraction, -XX:MinRAMFraction (1, ½, 1/3, ¼, …)
Java 10 :
Ajout de :
-XX:InitialRAMPercentage=n
-XX:MaxRAMPercentage=n
-XX:MinRAMPercentage=n
-XX:ActiveProcessorCount=n
-Xlog:os+container
Deprecated
-XX:+UseCGroupMemoryLimitForHeap
-XX:MaxRAMFraction
-XX:InitialRAMFraction
-XX:MaxRAMFraction
Options pour le contrôle de la mémoire
#DevoxxFR #ApresJava9
Fonctionnalités retirées
63
L’outil javah
utiliser javac –h pour générer des headers natifs
-Xoss, -Xsqnopause, -Xoptimize, -Xboundthreads et –Xusealtsigs
Options de la JVM
L’outil policytool
C:java>java -d32 MonApp
Unrecognized option: -d32
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.
–d32 et –d64
#DevoxxFR #ApresJava9 64
Conclusion
#DevoxxFR #ApresJava9
Conclusion
65
Java évolue, nous devons (devrons) suivre
JDK 9 migration guide fourni par Oracle
http://docs.oracle.com/javase/9/migrate
Mais elle peut se faire avec plusieurs stratégies
Dont certaines étapes peuvent être anticipées
La migration vers JPMS et les modules sera obligatoire
tôt ou tard
Téléchargez Java 10.0.1 et essayez
Elle va être délicate et longue
en tout cas plus longue et délicate que pour les précédentes versions
#DevoxxFR
Merci
66

Contenu connexe

Tendances

Back to the future of java (from 8 to 11 and beyond)
Back to the future of java (from 8 to 11 and beyond)Back to the future of java (from 8 to 11 and beyond)
Back to the future of java (from 8 to 11 and beyond)Jérôme Tamborini
 
Java version 11 - les 9 nouveautes
Java version 11 -  les 9 nouveautesJava version 11 -  les 9 nouveautes
Java version 11 - les 9 nouveautesAbdenour Bouateli
 
"Input/Ouput, 16 ans après" à Devoxx France 2012
"Input/Ouput, 16 ans après" à Devoxx France 2012"Input/Ouput, 16 ans après" à Devoxx France 2012
"Input/Ouput, 16 ans après" à Devoxx France 2012Jean-Michel Doudoux
 
Formation Gratuite Total Tests par les experts Java Ippon
Formation Gratuite Total Tests par les experts Java Ippon Formation Gratuite Total Tests par les experts Java Ippon
Formation Gratuite Total Tests par les experts Java Ippon Ippon
 
Formation JPA Avancé / Hibernate gratuite par Ippon 2014
Formation JPA Avancé / Hibernate gratuite par Ippon 2014Formation JPA Avancé / Hibernate gratuite par Ippon 2014
Formation JPA Avancé / Hibernate gratuite par Ippon 2014Ippon
 
Nouveau look pour une nouvelle vie : HTML5, Spring, NoSQL et Mobile
Nouveau look pour une nouvelle vie : HTML5, Spring, NoSQL et MobileNouveau look pour une nouvelle vie : HTML5, Spring, NoSQL et Mobile
Nouveau look pour une nouvelle vie : HTML5, Spring, NoSQL et MobileIppon
 
Java 2015 2016_zied_elleuch
Java 2015 2016_zied_elleuchJava 2015 2016_zied_elleuch
Java 2015 2016_zied_elleuchTarek Halloul
 
Presentation Rex Methodes Agiles
Presentation Rex Methodes AgilesPresentation Rex Methodes Agiles
Presentation Rex Methodes AgilesIppon
 
Spring Meetup Paris - Back to the basics of Spring (Boot)
Spring Meetup Paris - Back to the basics of Spring (Boot)Spring Meetup Paris - Back to the basics of Spring (Boot)
Spring Meetup Paris - Back to the basics of Spring (Boot)Eric SIBER
 
Web API & Cache, the HTTP way - Ippevent 10 Juin 2014
Web API & Cache, the HTTP way - Ippevent 10 Juin 2014Web API & Cache, the HTTP way - Ippevent 10 Juin 2014
Web API & Cache, the HTTP way - Ippevent 10 Juin 2014Ippon
 
Formation Spring Avancé gratuite par Ippon 2014
Formation Spring Avancé gratuite par Ippon 2014Formation Spring Avancé gratuite par Ippon 2014
Formation Spring Avancé gratuite par Ippon 2014Ippon
 
Gwt jetty et sources de données
Gwt   jetty et sources de donnéesGwt   jetty et sources de données
Gwt jetty et sources de donnéesFranck SIMON
 
Quoi de neuf à Devoxx France 2017 ?
Quoi de neuf à Devoxx France 2017 ?Quoi de neuf à Devoxx France 2017 ?
Quoi de neuf à Devoxx France 2017 ?Antoine Rey
 
Présentation Rex GWT 2.0
Présentation Rex GWT 2.0Présentation Rex GWT 2.0
Présentation Rex GWT 2.0Ippon
 

Tendances (20)

Back to the future of java (from 8 to 11 and beyond)
Back to the future of java (from 8 to 11 and beyond)Back to the future of java (from 8 to 11 and beyond)
Back to the future of java (from 8 to 11 and beyond)
 
Java version 11 - les 9 nouveautes
Java version 11 -  les 9 nouveautesJava version 11 -  les 9 nouveautes
Java version 11 - les 9 nouveautes
 
"Input/Ouput, 16 ans après" à Devoxx France 2012
"Input/Ouput, 16 ans après" à Devoxx France 2012"Input/Ouput, 16 ans après" à Devoxx France 2012
"Input/Ouput, 16 ans après" à Devoxx France 2012
 
Nouveautés de java 8
Nouveautés de java 8Nouveautés de java 8
Nouveautés de java 8
 
Formation Gratuite Total Tests par les experts Java Ippon
Formation Gratuite Total Tests par les experts Java Ippon Formation Gratuite Total Tests par les experts Java Ippon
Formation Gratuite Total Tests par les experts Java Ippon
 
Présentation1
Présentation1Présentation1
Présentation1
 
JAVA 8
JAVA 8JAVA 8
JAVA 8
 
Formation JPA Avancé / Hibernate gratuite par Ippon 2014
Formation JPA Avancé / Hibernate gratuite par Ippon 2014Formation JPA Avancé / Hibernate gratuite par Ippon 2014
Formation JPA Avancé / Hibernate gratuite par Ippon 2014
 
Nouveau look pour une nouvelle vie : HTML5, Spring, NoSQL et Mobile
Nouveau look pour une nouvelle vie : HTML5, Spring, NoSQL et MobileNouveau look pour une nouvelle vie : HTML5, Spring, NoSQL et Mobile
Nouveau look pour une nouvelle vie : HTML5, Spring, NoSQL et Mobile
 
Java 2015 2016_zied_elleuch
Java 2015 2016_zied_elleuchJava 2015 2016_zied_elleuch
Java 2015 2016_zied_elleuch
 
Presentation Rex Methodes Agiles
Presentation Rex Methodes AgilesPresentation Rex Methodes Agiles
Presentation Rex Methodes Agiles
 
Spring Meetup Paris - Back to the basics of Spring (Boot)
Spring Meetup Paris - Back to the basics of Spring (Boot)Spring Meetup Paris - Back to the basics of Spring (Boot)
Spring Meetup Paris - Back to the basics of Spring (Boot)
 
Base11
Base11Base11
Base11
 
Android ORMLite
Android   ORMLiteAndroid   ORMLite
Android ORMLite
 
Web API & Cache, the HTTP way - Ippevent 10 Juin 2014
Web API & Cache, the HTTP way - Ippevent 10 Juin 2014Web API & Cache, the HTTP way - Ippevent 10 Juin 2014
Web API & Cache, the HTTP way - Ippevent 10 Juin 2014
 
Spring Batch - concepts de base
Spring Batch - concepts de baseSpring Batch - concepts de base
Spring Batch - concepts de base
 
Formation Spring Avancé gratuite par Ippon 2014
Formation Spring Avancé gratuite par Ippon 2014Formation Spring Avancé gratuite par Ippon 2014
Formation Spring Avancé gratuite par Ippon 2014
 
Gwt jetty et sources de données
Gwt   jetty et sources de donnéesGwt   jetty et sources de données
Gwt jetty et sources de données
 
Quoi de neuf à Devoxx France 2017 ?
Quoi de neuf à Devoxx France 2017 ?Quoi de neuf à Devoxx France 2017 ?
Quoi de neuf à Devoxx France 2017 ?
 
Présentation Rex GWT 2.0
Présentation Rex GWT 2.0Présentation Rex GWT 2.0
Présentation Rex GWT 2.0
 

Similaire à Devoxx 2018 Après Java 8, Java 9 et 10

devoxx 2022 - 10 ans de Devoxx FR et de Java.pdf
devoxx 2022 - 10 ans de Devoxx FR et de Java.pdfdevoxx 2022 - 10 ans de Devoxx FR et de Java.pdf
devoxx 2022 - 10 ans de Devoxx FR et de Java.pdfJean-Michel Doudoux
 
Javaday Paris 2022 - Java en 2022 : profiter de Java 17
Javaday Paris 2022 - Java en 2022 : profiter de Java 17Javaday Paris 2022 - Java en 2022 : profiter de Java 17
Javaday Paris 2022 - Java en 2022 : profiter de Java 17Jean-Michel Doudoux
 
Du développement à la livraison avec JavaFX et le JDK9
Du développement à la livraison avec JavaFX et le JDK9Du développement à la livraison avec JavaFX et le JDK9
Du développement à la livraison avec JavaFX et le JDK9Thierry Wasylczenko
 
Soirée OSGi au Paris Jug (14/10/2008)
Soirée OSGi au Paris Jug (14/10/2008)Soirée OSGi au Paris Jug (14/10/2008)
Soirée OSGi au Paris Jug (14/10/2008)Cyrille Le Clerc
 
[Java] Versioning & Nouveautés JDK 12-15
[Java] Versioning & Nouveautés JDK 12-15[Java] Versioning & Nouveautés JDK 12-15
[Java] Versioning & Nouveautés JDK 12-15Romain Schlick
 
0251-formation-java-programmation-objet.pdf
0251-formation-java-programmation-objet.pdf0251-formation-java-programmation-objet.pdf
0251-formation-java-programmation-objet.pdfOmbotimbe Salifou
 
Drupagora - Les clés de la réussite d'un projet Drupal
Drupagora - Les clés de la réussite d'un projet DrupalDrupagora - Les clés de la réussite d'un projet Drupal
Drupagora - Les clés de la réussite d'un projet DrupalCore-Techs
 
MarsJUG - Le classpath n'est pas mort, mais presque
MarsJUG - Le classpath n'est pas mort, mais presqueMarsJUG - Le classpath n'est pas mort, mais presque
MarsJUG - Le classpath n'est pas mort, mais presqueAlexis Hassler
 
Paris Container Day 2016 : Les nouveaux défis du déploiement (Xebia Labs)
Paris Container Day 2016 : Les nouveaux défis du déploiement (Xebia Labs)Paris Container Day 2016 : Les nouveaux défis du déploiement (Xebia Labs)
Paris Container Day 2016 : Les nouveaux défis du déploiement (Xebia Labs)Publicis Sapient Engineering
 
20081008 - Tours Jug - Apache Maven
20081008  - Tours Jug - Apache Maven20081008  - Tours Jug - Apache Maven
20081008 - Tours Jug - Apache MavenArnaud Héritier
 
Midi technique - présentation docker
Midi technique - présentation dockerMidi technique - présentation docker
Midi technique - présentation dockerOlivier Eeckhoutte
 
Introduction à Groovy - OpenSource eXchange 2008
Introduction à Groovy - OpenSource eXchange 2008Introduction à Groovy - OpenSource eXchange 2008
Introduction à Groovy - OpenSource eXchange 2008Guillaume Laforge
 
NightClazz Build Tools & Continuous Delivery Avancé
NightClazz Build Tools & Continuous Delivery AvancéNightClazz Build Tools & Continuous Delivery Avancé
NightClazz Build Tools & Continuous Delivery AvancéZenika
 

Similaire à Devoxx 2018 Après Java 8, Java 9 et 10 (20)

devoxx 2022 - 10 ans de Devoxx FR et de Java.pdf
devoxx 2022 - 10 ans de Devoxx FR et de Java.pdfdevoxx 2022 - 10 ans de Devoxx FR et de Java.pdf
devoxx 2022 - 10 ans de Devoxx FR et de Java.pdf
 
Javaday Paris 2022 - Java en 2022 : profiter de Java 17
Javaday Paris 2022 - Java en 2022 : profiter de Java 17Javaday Paris 2022 - Java en 2022 : profiter de Java 17
Javaday Paris 2022 - Java en 2022 : profiter de Java 17
 
Chap 02 poo en java
Chap 02 poo en javaChap 02 poo en java
Chap 02 poo en java
 
JAVA Chapitre1
JAVA Chapitre1 JAVA Chapitre1
JAVA Chapitre1
 
Javaoop
JavaoopJavaoop
Javaoop
 
Du développement à la livraison avec JavaFX et le JDK9
Du développement à la livraison avec JavaFX et le JDK9Du développement à la livraison avec JavaFX et le JDK9
Du développement à la livraison avec JavaFX et le JDK9
 
Soirée OSGi au Paris Jug (14/10/2008)
Soirée OSGi au Paris Jug (14/10/2008)Soirée OSGi au Paris Jug (14/10/2008)
Soirée OSGi au Paris Jug (14/10/2008)
 
[Java] Versioning & Nouveautés JDK 12-15
[Java] Versioning & Nouveautés JDK 12-15[Java] Versioning & Nouveautés JDK 12-15
[Java] Versioning & Nouveautés JDK 12-15
 
Programmation Java
Programmation JavaProgrammation Java
Programmation Java
 
0251-formation-java-programmation-objet.pdf
0251-formation-java-programmation-objet.pdf0251-formation-java-programmation-objet.pdf
0251-formation-java-programmation-objet.pdf
 
Stratégie OpenJDK
Stratégie OpenJDKStratégie OpenJDK
Stratégie OpenJDK
 
Nouveautés Java 9-10-11
Nouveautés Java 9-10-11Nouveautés Java 9-10-11
Nouveautés Java 9-10-11
 
Drupagora - Les clés de la réussite d'un projet Drupal
Drupagora - Les clés de la réussite d'un projet DrupalDrupagora - Les clés de la réussite d'un projet Drupal
Drupagora - Les clés de la réussite d'un projet Drupal
 
MarsJUG - Le classpath n'est pas mort, mais presque
MarsJUG - Le classpath n'est pas mort, mais presqueMarsJUG - Le classpath n'est pas mort, mais presque
MarsJUG - Le classpath n'est pas mort, mais presque
 
Paris Container Day 2016 : Les nouveaux défis du déploiement (Xebia Labs)
Paris Container Day 2016 : Les nouveaux défis du déploiement (Xebia Labs)Paris Container Day 2016 : Les nouveaux défis du déploiement (Xebia Labs)
Paris Container Day 2016 : Les nouveaux défis du déploiement (Xebia Labs)
 
20081008 - Tours Jug - Apache Maven
20081008  - Tours Jug - Apache Maven20081008  - Tours Jug - Apache Maven
20081008 - Tours Jug - Apache Maven
 
Sonar-Hodson-Maven
Sonar-Hodson-MavenSonar-Hodson-Maven
Sonar-Hodson-Maven
 
Midi technique - présentation docker
Midi technique - présentation dockerMidi technique - présentation docker
Midi technique - présentation docker
 
Introduction à Groovy - OpenSource eXchange 2008
Introduction à Groovy - OpenSource eXchange 2008Introduction à Groovy - OpenSource eXchange 2008
Introduction à Groovy - OpenSource eXchange 2008
 
NightClazz Build Tools & Continuous Delivery Avancé
NightClazz Build Tools & Continuous Delivery AvancéNightClazz Build Tools & Continuous Delivery Avancé
NightClazz Build Tools & Continuous Delivery Avancé
 

Plus de Jean-Michel Doudoux

Les nouveautés de Java 21 - Rencontres dev Toulon octobre 2023.pdf
Les nouveautés de Java 21 - Rencontres dev Toulon octobre 2023.pdfLes nouveautés de Java 21 - Rencontres dev Toulon octobre 2023.pdf
Les nouveautés de Java 21 - Rencontres dev Toulon octobre 2023.pdfJean-Michel Doudoux
 
Les nouveautés de Java 21 - Devoxx MA 2023.pdf
Les nouveautés de Java 21 - Devoxx MA 2023.pdfLes nouveautés de Java 21 - Devoxx MA 2023.pdf
Les nouveautés de Java 21 - Devoxx MA 2023.pdfJean-Michel Doudoux
 
Les nouveautés de Java 19, 20 et 21 - RivieraDev 2023
Les nouveautés de Java 19, 20 et 21 - RivieraDev 2023Les nouveautés de Java 19, 20 et 21 - RivieraDev 2023
Les nouveautés de Java 19, 20 et 21 - RivieraDev 2023Jean-Michel Doudoux
 
En route vers Java 21 - Javaday Paris 2023
En route vers Java 21 - Javaday Paris 2023En route vers Java 21 - Javaday Paris 2023
En route vers Java 21 - Javaday Paris 2023Jean-Michel Doudoux
 
Devoxx France 2023 - Les nouveautés de Java 19 et 20
Devoxx France 2023 - Les nouveautés de Java 19 et 20Devoxx France 2023 - Les nouveautés de Java 19 et 20
Devoxx France 2023 - Les nouveautés de Java 19 et 20Jean-Michel Doudoux
 
Voxxeddays Lux 2022 - Profiling et monitoring avec le JDK
Voxxeddays Lux 2022 - Profiling et monitoring avec le JDKVoxxeddays Lux 2022 - Profiling et monitoring avec le JDK
Voxxeddays Lux 2022 - Profiling et monitoring avec le JDKJean-Michel Doudoux
 
Retours sur java 8 devoxx fr 2016
Retours sur java 8 devoxx fr 2016Retours sur java 8 devoxx fr 2016
Retours sur java 8 devoxx fr 2016Jean-Michel Doudoux
 

Plus de Jean-Michel Doudoux (7)

Les nouveautés de Java 21 - Rencontres dev Toulon octobre 2023.pdf
Les nouveautés de Java 21 - Rencontres dev Toulon octobre 2023.pdfLes nouveautés de Java 21 - Rencontres dev Toulon octobre 2023.pdf
Les nouveautés de Java 21 - Rencontres dev Toulon octobre 2023.pdf
 
Les nouveautés de Java 21 - Devoxx MA 2023.pdf
Les nouveautés de Java 21 - Devoxx MA 2023.pdfLes nouveautés de Java 21 - Devoxx MA 2023.pdf
Les nouveautés de Java 21 - Devoxx MA 2023.pdf
 
Les nouveautés de Java 19, 20 et 21 - RivieraDev 2023
Les nouveautés de Java 19, 20 et 21 - RivieraDev 2023Les nouveautés de Java 19, 20 et 21 - RivieraDev 2023
Les nouveautés de Java 19, 20 et 21 - RivieraDev 2023
 
En route vers Java 21 - Javaday Paris 2023
En route vers Java 21 - Javaday Paris 2023En route vers Java 21 - Javaday Paris 2023
En route vers Java 21 - Javaday Paris 2023
 
Devoxx France 2023 - Les nouveautés de Java 19 et 20
Devoxx France 2023 - Les nouveautés de Java 19 et 20Devoxx France 2023 - Les nouveautés de Java 19 et 20
Devoxx France 2023 - Les nouveautés de Java 19 et 20
 
Voxxeddays Lux 2022 - Profiling et monitoring avec le JDK
Voxxeddays Lux 2022 - Profiling et monitoring avec le JDKVoxxeddays Lux 2022 - Profiling et monitoring avec le JDK
Voxxeddays Lux 2022 - Profiling et monitoring avec le JDK
 
Retours sur java 8 devoxx fr 2016
Retours sur java 8 devoxx fr 2016Retours sur java 8 devoxx fr 2016
Retours sur java 8 devoxx fr 2016
 

Devoxx 2018 Après Java 8, Java 9 et 10

  • 1. #DevoxxFR #ApresJava8 1 Après Java 8, Java 9 et 10 Jean-Michel Doudoux @jmdoudoux
  • 2. #DevoxxFR #ApresJava9 Java 8 2 Les expressions lambdas références de méthodes Approche fonctionnelle : l’API Stream + Collector Les interfaces : les méthodes statiques et par défaut L’API Date & Time CompletableFuture Optional Permgen -> Metaspace …
  • 3. #DevoxxFR #ApresJava9 Java 8 3 Made Java great again ? TIOBE : langage de l’année en 2005 et en 2015 Un engouement certain constaté par la popularité de Java 8 Diffusé en mars 2014
  • 4. #DevoxxFR #ApresJava9 4 Sûrement la version la plus controversée Première fois que l’EC du JCP vote Non Diffusé en septembre 2017 2 updates : 9.0.1, 9.0.4 Introduit des changements majeurs Tout en tentant d’offrir une certaine compatibilité Java 9
  • 5. #DevoxxFR #ApresJava9 Java 9 : les fonctionnalités 5 API Fabriques pour des collections immuables Process API Reactive Streams (Flow API) Var Handles … Le système de modules (JPMS) issu du projet Jigsaw Introduit une rupture Avec un mode de compatibilité, pour faciliter la migration Evolutions mineures dans le langage Outils JShell Jlink pour créer des runtime compacts Recherche dans la Javadoc en HTML 5 Jdeprscan … JVM G1 est le ramasse-miettes par défaut Réduction de la taille mémoire (Compact Strings) Amélioration de la performance et de la sécurité Multi-Release Jar … + 89 JEPs
  • 6. #DevoxxFR #ApresJava9 Nouveau modèle de releases 6 LTS : le nouveau modèle de support (Oracle JDK) Version tous les 3 ans à partir de Java 11 Pour les clients 2 releases majeures de Java par an (OpenJDK) : en mars et septembre Les deux releases suivantes après Java 9 : Java 10 en mars 2018 Java 11 en septembre 2018 Java 9 n’est pas LTS Ni Java 10
  • 7. #DevoxxFR #ApresJava9 Java 10 7 12 JEPs 1 utile pour les développeurs + évolutions dans les API existantes 6 mois après Java 9, release de Java 10 Diffusé le 20 mars 2018 2 conséquences : 2) Java 9 quasiment pas utilisé Mais déjà obsolète avec la sortie de Java 10 1) Durée de release réduite -> nombre de fonctionnalités réduites
  • 8. #DevoxxFR #ApresJava9 Jean-Michel Doudoux 8 http://www.jmdoudoux.fr @jmdoudoux Co-fondateur du , membre du Auteur de 2 didacticiels Diffusés sous licence GNU FDL • Développons en Java (3400 pages) • Développons en Java avec Eclipse CTO et
  • 9. #DevoxxFR #ApresJava9 Roadmap 9 • Les a priori sur Java 9 • Les avantages de Java 9 • Faire un état des lieux avant migration • La migration vers Java 9 : les stratégies • Des fonctionnalités pour faciliter la migration • Les difficultés • Java 10
  • 10. #DevoxxFR #ApresJava9 10 Les a priori sur Java 9
  • 11. #DevoxxFR #ApresJava9 Mythes et réalités 11 Le classpath est remplacé par le module-path Le code de l’application doit être modularisé sun.misc.Unsafe est retiré NON NON NON Une application Java 8 s’exécute en Java 9 La majorité du code existant n'aura pas besoin d'être modifié Une application Java 8 compile en Java 9 Ça depend Ça depend OUI
  • 12. #DevoxxFR #ApresJava9 12 Les avantages de Java 9
  • 13. #DevoxxFR #ApresJava9 Améliorations de la syntaxe 13 Méthodes private dans les interfaces Opérateur diamant dans les classes anonymes internes Variables effectivement finales dans try with ressources @SafeVarags sur les méthodes d’instances private
  • 14. #DevoxxFR #ApresJava9 API et outils 14 Fabriques pour collection immuable JShell : un outil de type REPL Process API Flow API (Reactive Stream) Var Handles JavaDoc en HTML 5 avec recherche Enrichissement de CompletableFuture
  • 15. #DevoxxFR #ApresJava9 Améliorations de la JVM 15 Globalement de meilleures performances Segmented code Cache G1 comme GC par défaut Concaténation des chaînes avec InvokeDynamic Compact String Unified JVM Logging Unified GC Logging
  • 16. #DevoxxFR #ApresJava9 Les modules 16 Sont perçus comme contraignants Exemple de contraintes : plus d’accès par défaut aux classes public d’un module plus d’introspection par défaut sur les classes d’un module plus de split packages plus de dépendances circulaires La nécessité de définir les dépendances dans les module-info ET les outils de build …  moins de liberté utilisée pendant plus de 20 ans parfois avec abus Tous les systèmes de modules sont contraignants
  • 17. #DevoxxFR #ApresJava9 Les modules 17 Mais on doit profiter des avantages des modules L’occasion de remettre de l’ordre : dans le design des livrables dans les dépendances dans les API utilisées (notamment celles non supportées du JDK) Une configuration fiable Réduire les problèmes du classpath hell L’encapsulation forte Améliorer la sécurité et la maintenabilité
  • 18. #DevoxxFR #ApresJava9 4 types de modules 18 App Named modules Jar modulaire dans le module path Automatic modules Jar non modulaire dans le module path Nom extrait de MANIFEST.MF ou dérivé du nom du jar Tous les packages sont exposés Peuvent accéder à tous les autres modules Pont entre named modules et unnamed module Unnamed module Un seul module classes, jars modulaires ou non dans le class path tous les packages sont exposés Peut accéder à tous les autres modules Platform modules Modules du JRE
  • 19. #DevoxxFR #ApresJava9 Runtime personnalisé 19 Outil jlink (Java Linker) Pour créer un JRE personnalisé Ne contenant que le nécessaire pour l’exécution d’une application Deployer facilement une application Sans s’appuyer sur un JRE pré-installé Tous les jars doivent être modulaires Uniquement des named modules (pas d’automatic modules) Incluant TOUTES les dépendances
  • 20. #DevoxxFR #ApresJava9 20 Faire un état des lieux
  • 21. #DevoxxFR #ApresJava9 Utilité 21 Recenser les différents points à prendre en compte  Aider à choisir la stratégie de migration  Avoir une meilleure visibilité sur l’ampleur de la tâche Faire une cartographie des dépendances Vérifier pour chacune si une version modulaire existe En profiter pour faire du ménage Et prévoir des upgrades Utiliser l’outil jdeps pour obtenir des informations
  • 22. #DevoxxFR #ApresJava9 jdeps 22 Fournit dans le JDK depuis Java 8, amélioré en Java 9 Analyse statique du bytecode pour déterminer les dépendances Travaille sur les .class ou .jar A passer sur l’application mais aussi sur toutes les dépendances Pour obtenir de nombreuses informations : Des dépendances Les split packages Les API du JDK qui ne sont plus accessibles
  • 23. #DevoxxFR #ApresJava9 jdeps 23 Dépendances agrégées au niveau des packages ou des jars Possibilité de filtrage Différents formats de restitution dont des fichiers .dot Par défaut affiche : les modules du JDK requis les dépendances de chaque packages <package> -> <package> <module/JAR>
  • 24. #DevoxxFR #ApresJava9 Les options de jdeps 24 Nombreuses options : -h pour l’intégralité jdeps --class-path 'libs/*' -recursive monapp-3.2.jar Option Rôle --class-path ou -cp définir les dépendances dans le classpath --module-path définir les dépendances dans le module path -recursive ou –R parcours récursif des dépendances --package ou –P seulement les dépendances vers un package --dot-ouput créer des fichiers .dot par jar utilisable avec GraphViz -verbose:class dépendances entre classes --summary ou –s afficher un résumé des dépendances --generate-module-info générer le fichier module-info.java --generate-open-info générer le fichier module-info.java pour un module open --jdk-internals ou -jdkinternals trouver les API internes utilisées
  • 25. #DevoxxFR #ApresJava9 25 La migration vers Java 9
  • 26. #DevoxxFR #ApresJava9 Migrer une bibliothèque 26 Deux stratégies : Sans conversion en module Il faut absolument figer le nom du module avec l’attribut Automatic-Module-Name dans le fichier MANIFEST.MF Sinon le nom du module est déterminé à partir du nom du jar -> automatic module Ne DOIT pas changer lors de la modularisation La conversion en module d’un jar Ajout d’un fichier module-info fixe le nom du module et les dépendances Permet son utilisation dans le module-path et donc de le déclarer comme dépendance d’un autre module Permet toujours son utilisation via le classpath Toujours tester dans le classpath et le module path
  • 27. #DevoxxFR #ApresJava9 Migration d’une application 27 Différentes stratégies : Pas de migration Migration vers une autre techno Attente de la prochaine LTS Migration vers les modules Avec prise en compte du nouveau modèle de release Migration sans les modules Migration incrémentale
  • 28. #DevoxxFR #ApresJava9 Pas de migration 28 Il y a encore (de rares) applications qui tournent en Java 4/5 (2004) Attention : plus de mises à jour gratuites du JRE Pour profiter des corections, des nouvelles fonctionnalités dans la JVM Et surtout plus de mises à jour relatives à la sécurité (cf GDPR) et/ou la performance Un peu plus en Java 6 (2006) et beaucoup en Java 7 (2011) Pas de migration = rester en Java 8 Plus de support gratuit d’Oracle à partir de janvier 2019 (grâce à une extension d’Oracle) Grosses difficultés / impossibilité d’upgrader les dépendances
  • 29. #DevoxxFR #ApresJava9 Migration vers autre techno 29 Coût de réécriture et de test surtout pour de grosses applications Quel est le R.O.I. pour le back end ? Choix de la techno ? Php / ROR .Net JavaScript / Node.JS Smalltalk Scala, Kotlin ….
  • 30. #DevoxxFR #ApresJava9 Attente de la prochaine LTS 30 Stratégie viable puisque cela laisserait entre 2 et 3 ans pour migrer Vrai, sans le nouveau modèle de releases La prochaine version LTS : Java 11 (25 septembre 2018) Le support public de Java 8 est étendu à janvier 2019 2020 pour un usage personnel http://www.oracle.com/technetwork/java/eol-135779.html
  • 31. #DevoxxFR #ApresJava9 Mises à jour gratuites ou support payant ? 31 LTS : support (non gratuit) longue durée proposé par Oracle Selon plusieurs niveaux Article de Simon Ritter d’Azul System https://www.azul.com/java-stable-secure-free-choose-two-three/ Le nouveau modèle de release remet en cause Les longues périodes de maj gratuites appliquées jusqu’ici Entre deux versions de Java (2 à 4 ans) + 1 an d’extension Période de mises à jour gratuites très courte Uniquement jusqu’à la prochaine feature release (6 mois) Exemple : plus de support gratuit pour Java 9
  • 32. #DevoxxFR #ApresJava9 Migrer vers les modules 32 LA solution cible qui ne repose que sur des modules N’utilise que des modules : Plateform modules (JRE) Et named modules (applications et toutes les dépendances) Ajouter un module-info à chaque jar Tenir compte de certaines contraintes et difficultés Souvent compliqué et parfois impossible directement Notamment à cause des dépendances (en particulier les transitives)
  • 33. #DevoxxFR #ApresJava9 Migrer sans les modules 33 Il est possible de n’utiliser que le classpath Comme avant Java 9 Attention : le JRE est modulaire Permet une exécution en Java 9, généralement non sans certaines adaptations Prendre en compte certaines contraintes
  • 34. #DevoxxFR #ApresJava9 Migration incrémentale 34 Le JDK est modulaire L’application peut être modularisée (partiellement ou intégralement) ou pas Les dépendances ne sont pas toutes modulaires Certains modules peuvent coopérer avec les jars non modulaires => Nécessité de cohabitation entre jars modulaires et non modulaires
  • 35. #DevoxxFR #ApresJava9 Migration incrémentale 35 Plusieurs fonctionnalités facilitent cette cohabitation : L’option --illegal-access par défaut à permit Les options pour assouplir les règles de JPMS Multi-Release JAR Facilitée par la coexistence du classpath et du module path => Migration incrémentale sera généralement la stratégie utilisée
  • 36. #DevoxxFR #ApresJava9 36 Des fonctionnalités pour faciliter la migration
  • 37. #DevoxxFR #ApresJava9 Classpath et module path 37 Peuvent être utilisés en simultané Jars non modulaires et modulaires peuvent être mis dans l’un ou l’autre Implique des contraintes d’utilisation Classpath Module path Jar standard Unnamed module Automatic module Jar modulaire Application named module
  • 38. #DevoxxFR #ApresJava9 Un jar est il modulaire ? 38 Utiliser l’option --describe-module ou –d de l’outil jar C:java>jar --file monutil-1.1.jar -d Descripteur de module introuvable. Module automatique dérivé. monutil automatic requires java.base mandated contains com.oxiane.app.util C:java>jar -d --file com.oxiane.app.main-1.0.jar com.oxiane.app.main jar:file:///com.oxiane.app.main.jar/!module-info.class exports com.oxiane.app.main requires com.oxiane.app.util requires java.base mandated contains com.oxiane.app.common
  • 39. #DevoxxFR #ApresJava9 Accès entre modules 39 Unnamed … xxx.jar yyy.jar zzz.jar Classpath Module Path JDK Platform … java.base java.xml java.logging Automatic aaa.jar bbb.jar ccc.jar App named com.www.jar com.xxx.jar com.yyy.jar java.sql expliciteimplicite com.zzz.jar
  • 40. #DevoxxFR #ApresJava9 L’option --illegal-access 40 Solution temporaire qui sera changée dans une future version La valeur par défaut sera alors deny Autoriser ou non les accès par introspection par le unnamed module Fait perdre une partie des bénéfices de JPMS Mais permet d’ exécuter plus facilement une application en Java 9 permit affiche un warning à chaque premier accès illégal Ne pas ignorer ces warnings Valeur par défaut : permit qui autorise tous les accès
  • 41. #DevoxxFR #ApresJava9 L’option --illegal-access 41 Autres valeurs possibles : warning : Warning à chaque accès debug : Warning + informations complémentaires deny : Interdire tous les accès Permet d’anticiper sur le futur
  • 42. #DevoxxFR #ApresJava9 Les options pour assouplir JPMS 42 JPMS est très strict Parfois bien utile (voire nécessaire) dans certains cas, Mais il ne faut pas abuser de leur utilisation --add-module ajouter des modules au graphe --add-reads permettre à un module d’accéder à un autre --add-exports exporter un package d’un module --patch-module ajouter des classes à un module --add-opens : permettre un accès par introspection à un package 5 options (javac et jvm) permettent des assouplissements : Elles ne modifient pas le module-info
  • 43. #DevoxxFR #ApresJava9 Multi-Release JAR (MR JAR) 43 Etendre le format jar pour inclure des versions spécifiques de .class pour d’autres versions de Java dans un même fichier jar Racine du fichier jar MaClasse.class META-INF MANIFEST.MF versions 9 MaClasse.class 10 MaClasse.class Un jar peut contenir plusieurs .class pour différentes versions La version courante à la racine Les autres versions (>=9), dans META-INF/versions/N Multi-Release: true dans MANIFEST.MF Support à partir de Java 9
  • 44. #DevoxxFR #ApresJava9 jdeprscan 44 Nouvel outil de Java 9 Analyse statique des .class pour rechercher les API deprecated On n’y est pas habitué Il y a des API deprecated depuis Java 1.1 Notamment les API deprecated for removal Important car elles seront retirées Dans un futur plus ou proche jdeprscan xxx-3.0.7.jar Jar file xxx-3.0.7.jar: class xx/xxx/XxxxXxx uses deprecated class javax/security/cert/X509Certificate class xx/xxx/XxxxXxx uses deprecated method java/lang/Object::finalize()V class xx/xxx/XxxxXxx$1 overrides deprecated method java/lang/Object::finalize()V class xx/xxx/XxxxXxx uses deprecated class javax/security/cert/CertificateException
  • 46. #DevoxxFR #ApresJava9 Les incompatibilités 46 L’identifiant _ n’est plus valide Alignement de la structure des répertoires du JDK et JRE Fonctionnalités de la JVM retirée Les fichiers rt.jar et tools.jar Le mécanisme d’extension Le mécanisme endorsed
  • 47. #DevoxxFR #ApresJava9 Les API internes 47 La plupart des API internes sont encapsulées et ne sont donc plus accessibles Ces API sont non standard / non supportées Elles n’auraient jamais dû être utilisées Certaines sont remplacées Ex : sun.misc.BASE64Decoder Certaines sont encore accessibles En attendant leur remplacement Ex : sun.misc.Unsafe (partiellement remplacée par Var Handles)
  • 48. #DevoxxFR #ApresJava9 Les API internes 48 Utiliser jdeps avec l’option --jdkinternals MaClasse.class -> JDK removed internal API MaClasse -> sun.misc.BASE64Encoder JDK internal API (JDK removed internal API) JDK Internal API Suggested Replacement ---------------- --------------------- sun.misc.BASE64Encoder Use java.util.Base64 @since 1.8 Utiliser --illegal-access=deny pour simuler le futur
  • 49. #DevoxxFR #ApresJava9 Les dépendances cycliques 49 Des jars non modulaires peuvent avoir des dépendances cycliques Ce n’est pas une bonne pratique Mais c’est courant dans le classpath Cela peut donc compliquer la migration Les modules NE peuvent PAS avoir de dépendances cycliques A la compilation ou à l’exécution
  • 50. #DevoxxFR #ApresJava9 Split packages 50 Packages présents dans plusieurs jars Pour des raisons de compatibilité : les split packages sont autorisés dans l’unnamed module Java 9 interdit les split packages Pour assurer la fiabilité de la configuration S’applique pour les packages dans les modules des modules exportés ou NON Courant dans le classpath
  • 51. #DevoxxFR #ApresJava9 Nouveau format de version La version est parfois utilisée pour de mauvaises raisons Solution : Utiliser l’API Runtime.Version Utiliser MR JAR Le format de version change de nouveau en Java 10 Rechercher du code qui parse le numéro de version Pas évident car aucune API standard Le format de la version de Java 9 change
  • 52. #DevoxxFR #ApresJava9 Les modules Java EE 52 Les modules Java EE ne sont pas résolus par défaut JAX-B, JAX-WS, JavaBeans Activation Framework, JTA, Commons annotations, CORBA • java.activation (JAF) • java.corba (CORBA) • java.transaction (JTA) • java.xml.bind (JAX-B) • java.xml.ws (JAX-WS et SAAJ) • java.xml.ws.annotation (Commons annotations) Le module java.se.ee regroupe ces 6 modules Plus 2 modules du JDK • jdk.xml.ws (outils pour JAX-WS : wsgen, wsimport) • jdk.xml.bind (outils pour JAXB : xjc, schemagen) Ils sont deprecated for removal en Java 9
  • 53. #DevoxxFR #ApresJava9 Les modules Java EE 53 Ou de préférence, utiliser une tierce dépendance Utiliser l’option --add-modules <module>(,<module>)* JAF Automatic-Module-Name: java.activation <groupId>javax.activation</groupId> <artifactId>javax.activation-api</artifactId> <version>1.2.0</version> JTA <groupId>javax.transaction</groupId> <artifactId>javax.transaction-api</artifactId> <version>1.3</version> JAXB nom du module java.xml.bind <groupId>javax.xml.bind</groupId> <artifactId>jaxb-api</artifactId> <version>2.3.0</version> JAX-WS <groupId>com.sun.xml.ws</groupId> <artifactId>jaxws-ri</artifactId> <version>2.3.0</version> <type>pom</type> CORBA ??? Seule solution à partir de Java 11 La JEP 320 (Remove the Java EE and CORBA Modules) est intégrée Common annotations Automatic-Module-Name: java.annotation <groupId>javax.annotation</groupId> <artifactId>javax.annotation-api</artifactId> <version>1.3.1</version>
  • 54. #DevoxxFR #ApresJava9 Les dépendances optionnelles 54 Dépendances utilisées à l’exécution uniquement si présente Exemple : une implémentation d’un cache Solution 2 : Utiliser un service pour découpler consommateur et fournisseur Fournisseur : provides xxx with yyy dans le module-info Consommateur : uses xxx dans le module-info Utiliser l’API ServiceLoader pour charger la classe Solution 1 : requires static dans le module-info Utiliser l’introspection pour créer des instances de manière défensive
  • 56. #DevoxxFR #ApresJava9 Java 10 56 Java 10 repose sur Java 9 Avec des corrections et évolutions mineures 12 JEPs : 286: Local-Variable Type Inference 304: Garbage-Collector Interface 307: Parallel Full GC for G1 310: Application Class-Data Sharing 312: Thread-Local Handshakes 319: Root Certificates 296: Consolidate the JDK Forest into a Single Repository 313: Remove the Native-Header Generation Tool (javah) 314: Additional Unicode Language-Tag Extensions 316: Heap Allocation on Alternative Memory Devices 317: Experimental Java-Based JIT Compiler 322: Time-Based Release Versioning Une release tous les 6 mois -> une release plus petite
  • 57. #DevoxxFR #ApresJava9 L’inférence de type des variables locales 57 Depuis Java 7, l’inférence de type est de plus en plus utilisée Avec Java 10 : pour faciliter la déclaration de variables locales var i = 2; // int var j = 2L; // long var var = "Bonjour"; // String var references = new HashMap<Integer,String>(); // HashMap<Integer,String> var chemin = Paths.get("fichier.txt"); // Path var contenu = Files.readAllBytes(chemin); // byte[] var objet = new Serializable() {} ; // MaClasse$1 var est utilisable dans les boucles et try with resources for (var i = 0; i < 10; i++) { ... } for (var arg : args) { ... } try (var file = new FileInputStream(new File("monfichier.txt"))) { ... } Avec l’instruction var Qui n’est pas un mot clé
  • 58. #DevoxxFR #ApresJava9 L’inférence de type des variables locales 58 Plusieurs situations sont illicites var valeur; // cannot use 'var' on variable without initializer var obj = null; // variable initializer is 'null' var a=1, b=2; // 'var' is not allowed in a compound declaration // var a=1; var b=2; var chaines = {"e1","e2"}; // array initializer needs an explicit target-type // var chaines = new String[] {"e1","e2"}; var additionner = (a,b) -> a+b; // lambda expression needs an explicit target-type // var additionner = (IntBinaryOperator) (a,b) -> a+b var comparerStr = String::compareTo; // method reference needs an explicit target-type // var comparerStr = (Comparator<String>) String::compareTo var valeur = 10; valeur = "bonjour"; // incompatible types: String cannot be converted to int // Java n’est pas Javascript et reste statiquement typé Incompatibilité jshell> class var {} | Error: | 'var' not allowed here | as of release 10, 'var' is a restricted local variable type and cannot be used for type declarations
  • 59. #DevoxxFR #ApresJava9 L’inférence de type des variables locales 59 Utiliser var avec discernement le code peut être plus ou moins lisible (surtout sans IDE) Importance accrue du nom des variables l’abstraction est limitée : pas d’inférence vers un super type ou une interface le type inféré est ArrayList<String> List<String> aurait été préférable jshell> var liste = new ArrayList<String>(); liste ==> [] jshell> liste.trimToSize() jshell> jshell> List<String> liste2 = new ArrayList<>(); liste2 ==> [] jshell> liste2.trimToSize() | Error: | cannot find symbol | symbol: method trimToSize() | liste2.trimToSize() | ^---------------^
  • 60. #DevoxxFR #ApresJava9 Mises à jour des API 60 Optional, OptionalInt, OptionalLong, OptionalDouble orElseThrow() : alternative à get() java.util.stream.Collectors toUnmodifiableList() toUnmodifiableSet() toUnmodifiableMap(Function, Function) toUnmodifiableMap(Function, Function, BinaryOperator) List, Set, Map static copyOf(Collection) : copie immuable de la collection
  • 61. #DevoxxFR #ApresJava9 Support de Docker 61 Java 10 : Meilleur support des conteneurs Docker JDK-8189497 et JDK-8186315, JDK-8179498, JDK-8186248, JDK-8146115 Option UseContainerSupport (Linux uniquement) activée par défaut, -XX:-UseContainerSupport pour désactiver Extraction d’informations du conteneur (cgroup) nombre de CPU alloué au conteneur mémoire allouée au conteneur Détection de l’exécution dans un conteneur
  • 62. #DevoxxFR #ApresJava9 Support de Docker 62 Java 8u131 et Java 9 -XX:+UnlockExperimentalVMOptions (Linux uniquement) -XX:+UseCGroupMemoryLimitForHeap (Linux uniquement) -XX:InitialRAMFraction, -XX:MaxRAMFraction, -XX:MinRAMFraction (1, ½, 1/3, ¼, …) Java 10 : Ajout de : -XX:InitialRAMPercentage=n -XX:MaxRAMPercentage=n -XX:MinRAMPercentage=n -XX:ActiveProcessorCount=n -Xlog:os+container Deprecated -XX:+UseCGroupMemoryLimitForHeap -XX:MaxRAMFraction -XX:InitialRAMFraction -XX:MaxRAMFraction Options pour le contrôle de la mémoire
  • 63. #DevoxxFR #ApresJava9 Fonctionnalités retirées 63 L’outil javah utiliser javac –h pour générer des headers natifs -Xoss, -Xsqnopause, -Xoptimize, -Xboundthreads et –Xusealtsigs Options de la JVM L’outil policytool C:java>java -d32 MonApp Unrecognized option: -d32 Error: Could not create the Java Virtual Machine. Error: A fatal exception has occurred. Program will exit. –d32 et –d64
  • 65. #DevoxxFR #ApresJava9 Conclusion 65 Java évolue, nous devons (devrons) suivre JDK 9 migration guide fourni par Oracle http://docs.oracle.com/javase/9/migrate Mais elle peut se faire avec plusieurs stratégies Dont certaines étapes peuvent être anticipées La migration vers JPMS et les modules sera obligatoire tôt ou tard Téléchargez Java 10.0.1 et essayez Elle va être délicate et longue en tout cas plus longue et délicate que pour les précédentes versions