Back to the future of java (from 8 to 11 and beyond)
1. Back to the future of
Java
DE JDK 1 À JDK 11, VOIRE MÊME PLUS CAR LÀ OÙ ON VA, ON N’A PAS
BESOIN… DE ROADMAP… EN FAIT SI !
Jérôme Tamborini
1
2. Jérôme Tamborini
C’est qui lui ?
@jerometambo
Mais il a déjà fait des
talks (on croirait pas) ?
TP Git avancé
Talk sur les tests
exploratoires
2
3. Disclaimer
Tout ce que je vais présenter ici ce soir
est le fruit de ma pure compréhension personnelle
n’engage que moi
Talk plutôt technique
jerome.tamborini@gmail.com
3
4. Qu’est-ce qu’il va raconter celui-ci ?
Comment Java ? Java bien et toi ?
Java 8 : λ, oui mais quoi d’autre ?
Que se passe-t-il après Java 8 ?
Java 9, 10 et 11
REX : je migre mon projet de 1.8 à 11
Au secours on ne comprend plus rien !
4
5. Comment Java ? Java bien et toi ?
Syntaxe dérivée du C
Java a été conçu pour résoudre un problème
Write once
Run anywhere
JVM
5
6. Comment Java ? Java bien et toi ?
Nan mais aujourd’hui Java c’est mort
6
7. Comment Java ? Java bien et toi ?
Java c’est « has been » il parait …
Sauf que pas de bras, pas de chocolat !
7
10. Java 8 : λ, oui mais quoi d’autre ?
Plus grosse évolution de Java en 15 ans
Programmation fonctionnelle
« Ah oui je comprends mieux »
10
11. Java 8 : λ, oui mais quoi d’autre ?
λ
Closure
Redéfinition de la SAM d’une @FunctionalInterface
Plusieurs « grands » types
Predicat
Consumer
Supplier
Function
Apparition d’un nouvel opérateur : ->
myString -> System.out.println(myString)
11
12. Java 8 : λ, oui mais quoi d’autre ?
Streams (et Collectors)
A quoi ça sert ?
Traiter efficacement des données
Map, Filter, Reduce
Ecrire de façon simple
Pourquoi ne pas avoir fait évoluer Collections
Mains libres
Ne pas polluer l’API la plus utilisée de Java
12
13. Java 8 : λ, oui mais quoi d’autre ?
Streams (et Collectors)
Du coup c’est quoi un Stream ?
Un objet qui sert à définir des opérations
Ne possède pas les données qu’il traite
S’interdit de modifier les données qu’il traite
Traite les données en une passe
Possède deux types d’opération
Intermédiaires
Finales
Optimisé d’un point de vue algo
Capable de calculer en //
13
14. Java 8 : λ, oui mais quoi d’autre ?
Optional<T>
La supposée fin des NPE (au moins des nullCheck)
Permet de tester la présence / l’absence de valeur
Peut se voir comme un Stream à 0 ou 1 élément
Coût (négligeable) en performances
Limitations
final
Non sérialisable
Mon avis
Pas de retour
Pas de variable d’instance
Pas en paramètre
14
15. Java 8 : λ, oui mais quoi d’autre ?
Un peu de code ?
15
16. Java 8 : λ, oui mais quoi d’autre ?
Les dates, c’est une horreur en Java !
Du coup nouvelle API java.time
On parle désormais de
Temps machine
Instant
Duration
Temps humain
ZoneId, ZonedDateTime, etc.
LocalDate, LocalDateTime, etc.
DayOfWeek, MonthDay, etc.
Passerelles entre Date/Calendar et java.time
16
17. Java 8 : λ, oui mais quoi d’autre ?
Et la mémoire dans tout ça ?
Remplacement de PermGen par Metaspace
Metadatas sur les classes
Zone spéciale de la heap
-XX:PermSize=N -XX:MetaspaceSize=N
-XX:MaxPermSize=N -XX:MaxMetaspaceSize=N
17
18. Java 8 : λ, oui mais quoi d’autre ?
Java + JavaScript = ❤
Nashorn : moteur javascript embarqué pour la JVM
Intégration de code backend Java + JS
Plus besoin de
Node.js (par ex.)
IPC/RPC ou qu’est-ce pour communiquer
18
19. Java 8 : λ, oui mais quoi d’autre ?
Mais encore
Parallel arrays
parallelSort()
Jmh
Outil de benchmark d’algo
Type annotations
@NonNull Object ref = null; // A checker will throw an exception
Map<@NonNull String, @NonEmpty List<@Readonly Document>> files;
Method references
Consumer<String> c = s -> System.out.println(s);
Consumer<String> c = System.out::println;
Méthodes par défaut et statiques dans les interfaces
19
20. Que se passe-t-il après Java 8 ?
Critiques
« Evolution trop lente de Java »
« Pas d’évolutions majeures pour suivre les besoins du monde du dev. »
Attention ça change !
Une version tous les 6 mois
Version LTS ou non
OracleJDK
OpenJDK
Durée de release réduite -> nombre de fonctionnalités réduit
http://www.oracle.com/technetwork/java/eol-135779.html
20
21. Que se passe-t-il après Java 8 ?
Les impacts sur notre cycle de dev ?
Avoir une CI
De bonne facture
Permettre de tester la compil’, l’assemblage
et la validation sur une Nighty build
Versions EA
Open JDK
Upgrade de version de Java sereinement
21
23. Java 9 : elle existe cette version ?
Introduit des changements majeurs
Codename Jigsaw : modules, modules everywhere
Java Platform Module System
Changement le plus structurel
89 JEPs
APIs
Outils
Performances / JVM
23
24. Java 9 : elle existe cette version ?
Les modules
C’est contraignant
Moins de liberté
Accès
Introspection
Split packages
Dépendances cycliques interdites
Gestion supplémentaire
Mais c’est pas pour rien
Encapsulation forte
Sécurité
Maintenabilité
Supprimer (à terme) les problèmes de
« classpath hell »
Remettre de l’ordre dans nos gros
projets Java
Performances
24
25. Java 9 : elle existe cette version ?
Et c’est quoi alors ces modules ?
Ensemble de code (de packages)
et de ressources nommé
Décrit sa visibilité et ses dépendances
Via un fichier module-info
Introduction du module-path
Ne remplace pas (encore) le classpath
25
26. Java 9 : elle existe cette version ?
Plusieurs types de modules (pour notre bien)
Platform modules
JRE
Unnamed module
« One module to rule them all »
Classes, jars du class-path
Tous les packages sont exposés
Accès à tout
App Named modules
Jars modulaires dans le module path
Automatic modules
Jars « standard » (non modulaires)
Placés dans le module path
Tous les packages sont exposés
Nom calculé depuis le nom du Jar ou spécifié
dans le fichier MANIFEST.MF
26
27. Java 9 : elle existe cette version ?
Mais du coup le JDK, il est modulaire ?
27
28. Java 9 : elle existe cette version ?
Et on a des outils pour nous aider ?
Jdeps
java –describe-module java.sql
Jlink
Créer une version « custom light » du JRE utilisé
~200Mo JRE complet
~30Mo JRE avec juste le module java.base
28
29. Java 9 : elle existe cette version ?
Parallèle avec les outils de build (Maven / Gradle)
JPMS ne prend pas en charge les versions
JPMS ne va pas aller récupérer les dépendances dans un repo
29
30. Java 9 : elle existe cette version ?
En vrai ça donne quoi ?
30
31. Java 9 : elle existe cette version ?
« Moi j’aimerais bien livrer un jar runnable sous plusieurs versions de Java
! » : Multi Release Jars
Permet d’avoir plusieurs versions d’une même classe
Compilées avec des versions différentes de Java
A partir de la version 9
31
32. Java 9 : elle existe cette version ?
« Mes devs aiment utiliser des méthodes dépréciées …
…en tout cas, ça n’a pas l’air de les déranger beaucoup »
Outil dispo : jdeprscan
32
33. Java 9 : elle existe cette version ?
Des fois on aimerait bien tester du code tout simplement à la python
(REPL)
JShell
33
34. Java 9 : elle existe cette version ?
Du coup, comment migrer évoluer d’une version ≤ 8 vers une version ≥ 9
Ca dépend, ça dépasse
Petit projet + pas beaucoup de dépendances One shot possible
Gros projet + pas beaucoup de dépendances Prendre son temps pour identifier
les modules puis les créer
Gros projet + beaucoup de dépendances Itératif
La mauvaise idée
On touche à rien (bah oui ça marche comme ça, pourquoi on changerait ?)
Fin support JDK 1.8 en janvier 2019
Plus d’évolutions, plus de mises à jour du JDK, plus de mises à jour de sécurité
34
36. Java 10 : what’s new ?
Inférence de type
Un prémice dans Java 1.7
ArrayList<String> strings = new ArrayList<>();
Un vrai (début) d’implémentation dans Java 10 : var
HashMap<String,List<Personne>> tableCorrespondance = new
HashMap<String,List<Personne>>();
var tableCorrespondance = new HashMap<String,List<Personne>>();
Variables locales
Initialisées
36
37. Java 10 : what’s new ?
API Collections
Je veux une version immuable de ma collection
List.copyOf(), Set.copyOf(), et Map.copyOf().
API Collectors
Collectors.toUnmodifiableList()
Collectors.toUnmodifiableSet()
Collectors.toUnmodifiableMap(keyFunc, valueFunc)
37
38. Java 10 : what’s new ?
Amélioration des performances
Optimisation du G1
Thread-Local Handshakes
Application Class-Data Sharing
38
40. Java 11 : déjà ?
Ca sort quand ?
http://www.java-countdown.xyz/
25/09/2018
2ème version LTS (Long Time Support)
Moins de features
10 JEPs sûrs
https://bugs.openjdk.java.net/secure/Dashboard.jspa?selectPageId=17668
40
41. Java 11 : déjà ?
Suppression des modules JavaEE et Corba
Sortie de JavaFX du JDK OpenJFX (OpenJDK)
Sécurité
TLS 1.3
Algorithmes de chiffrement
ChaCha20
Poly1305
Simplification du client HTTP
Fabriques sur HttpClient, HttpRequest et HttpResponse
41
42. Java 11 : déjà ?
Scripting en java ?
Launch Single-File Source-Code Programs
Effet demo ? Effet Windows
./hello 2018
42
43. Java 11 : déjà ?
Local-Variable Syntax for Lambda Parameters
43
44. Et après Java 11 ?
Project Valhalla
JEP 169: Value Objects
JEP 218: Generics over Primitive Types
Perfs : rapprocher la gestion des types extends Object
de la gestion des types primitifs
Permettre les types primitifs dans les Generics
44
45. Et JavaEE, on en parle ?
Bah on peut, déjà ça ne s’appelle plus JavaEE
Depuis 09/2017
45
46. REX : je migre mon projet de 1.8 à 11
Java 1.8 Java 10
Tests Powermock sortent en exception au run (InitializationError)
Relimiter la taille des fichiers JSP
<jsp:include> à préférer à <%@ include file="...jspf" %>
Java 10 Java 11
Ajouter les dépendances au niveau de Maven/gradle de ce qui est supprimé de JDK
Eclipse pas encore prêt, utiliser IntelliJ
Liquibase : ça compile mais... ça plante. Il faut monter au dessus de la 3.5.4
Maven prêt pour compiler : monter le compiler-plugin en 3.8.0 en précisant release
11
46
47. Au secours on ne comprend plus rien !
Ah mais c’est pas simple ! Faisons le point.
« On est obligé de rendre notre application modulaire »
Non pas du tout, lorsque l’on ne fait rien le code tourne dans l’unnamed module
« Du coup il y a 2 versions de Java par an désormais ? »
Oui, à mois fixe : mars et septembre
« J’ai jamais compris la différence entre OpenJDK et OracleJDK »
C’est pas grave, à partir de Java 11 il n’y en a plus
Flight Recorder et Mission Control seront inclus dans OpenJDK
Java FX et Java Web Start supprimés de Oracle JDK
47
48. Au secours on ne comprend plus rien !
Ah mais c’est pas simple ! Faisons le point.
« Y’aura encore des mises à jour sur les versions de Java ? »
Versions non LTS
Plus de mises à jour dès la sortie de la version suivante
Versions LTS
Mises à jour, si on a choisit l’Oracle JDK et ce qui va avec $$$
Plus de mises à jour dès la sortie de la version suivante si on a choisit l’OpenJDK
« Et du coup les LTS ? »
La première c’est Java 1.8, avec fin de support gratuit en 01/2019
Après c’est Java 11, puis Java 17, puis Java 23, etc.
48
49. Au secours on ne comprend plus rien !
Ah mais c’est pas simple ! Faisons le point.
« Alors on ne peut plus utiliser OracleJDK si on ne paye pas ? »
Apparemment si, pour le développement et les tests seulement
Pour la production $$$
49