URL: https://linuxfr.org/news/java-15-est-sorti Title: Java 15 est sorti Authors: barmic 𩩠bobble bubble, NonolapĂ©ro, Yves Bourguignon, Lawless, BenoĂźt Sibaud, BAud, Davy Defaud, theojouedubanjo et Ysabeau đ§¶ Date: 2020ćčŽ09æ04æ„T13:08:31+02:00 License: CC By-SA Tags: java Score: 55 Ce 15 septembre 2020 sort Java 15. Câest lâoccasion pour cette dĂ©pĂȘche de revenir sur les nouveautĂ©s entre les blocs de texte et autres ramasseâmiettes. On en profite pour parler de quelques informations autour de Java (les vingtâcinq ans de la plateâforme, les nouveaux champions, etc). ---- [OpenJDK 15](https://openjdk.java.net/projects/jdk/15/) [Quarkus 1.5](https://quarkus.io/blog/quarkus-1-5-final-released/) ---- # Java 15 ## Abandons Avec ce nouveau rythme, Java sâautorise Ă supprimer des parties de la plateâforme. Pour cette version : - le systĂšme dâexploitation [Solaris](https://fr.wikipedia.org/wiki/Solaris_(syst%C3%A8me_d%27exploitation)) et lâarchitecture [SPARC](https://fr.wikipedia.org/wiki/Architecture_SPARC), [rendus obsolĂštes par la derniĂšre version](https://linuxfr.org/news/java-14-tombe-le-masque#toc-les-mises-au-placard-et-lesd%C3%A9parts), ne sont plus pris en charge ([JEP 381](https://openjdk.java.net/jeps/381)) â cocasse quand on connaĂźt les dĂ©buts du langage ; - [Nashorn](https://fr.wikipedia.org/wiki/Nashorn_(moteur_JavaScript)), le moteur JavaScript inclus dans le JDK, a lui aussi Ă©tĂ© retirĂ© ([JEP 372](https://openjdk.java.net/jeps/372)), il Ă©tait considĂ©rĂ© comme obsolĂšte depuis la version 11 sortie en septembre 2018 ; - ce nâest pas encore une suppression, mais RMI activation (et seulement RMI activation pas tout RMI) est rendu obsolĂšte ([JEP 385](https://openjdk.java.net/jeps/385)) ; - _biased locking_ nâest plus activĂ© par dĂ©faut (il faut ajouter lâoption `-XX:+UseBiasedLocking`), elle est du mĂȘme coup considĂ©rĂ©e obsolĂšte ([JEP 374](https://openjdk.java.net/jeps/374)). ### ConsĂ©quences des retraits #### Cas de la prise en charge SPARC/SOLARIS Le JDK Ă©tant plutĂŽt vaste, le retrait de la prise en charge dâune architecture a des consĂ©quences Ă de trĂšs nombreux endroits allant des systĂšmes de construction, la sĂ©curitĂ©, la gĂ©nĂ©ration du _bytecode_ ou encore la gĂ©nĂ©ration dâ[IHM](https://fr.wikipedia.org/wiki/Interactions_homme-machine "interfaces hommeâmachine"). La personne en charge de la JEP a donc fait le tour du propriĂ©taire pour retirer tout ce qui devait lâĂȘtre, comme on peut le voir sur [la liste de diffusion](https://mail.openjdk.java.net/pipermail/jdk-dev/2020-May/004292.html). Les plus curieux pourront suivre les diffĂ©rents liens pour voir le mode de dĂ©veloppement du JDK et les spĂ©cificitĂ©s de chaque domaine. Au final, ce sont plus de 127 000 lignes qui ont Ă©tĂ© supprimĂ©es, ce qui ne reprĂ©sente que moins dâun pourcent du nombre total de lignes de code. #### Cas de la gestion du JSON Suite Ă la suppression du Nashorn JavaScript Engine, il est apparu que le JDK utilisait le JavaScript et par consĂ©quent le JSON pour certaines fonctionnalitĂ©s. Se pose alors la question dâune gestion native du JSON ou de laisser cette compĂ©tence Ă des bibliothĂšques tierces. Actuellement, rien nâest dĂ©cidĂ© et il y a deux directions possibles : + oui, mais sous quelle forme et quand ? + non pas pour Ă©viter dâavoir quelque chose de mal foutu comme pour le XML ou encore le journalisation et se concentrer sur ce qui fait rĂ©ellement la plusâvalue du JDK. ## NouveautĂ©s ### Ramasseâmiettes Deux nouveaux [ramasseâmiettes](https://fr.wikipedia.org/wiki/Ramasse-miettes_(informatique)) (_garbage collectors_ â gc) sont disponibles en stable avec cette version : #### Shenandoah Shenandoah est un ramasseâmiettes qui vise Ă rĂ©duire les temps de pause. Pour atteindre cet objectif, il dĂ©place les objets sans avoir Ă mettre en pause lâapplication. Il est aussi capable de mieux parallĂ©liser le dĂ©placement dâobjet. Cela ne supprime pas totalement les pauses : elles sont encore nĂ©cessaires pour libĂ©rer la mĂ©moire. Avec Shenandoah, la vĂ©rification des objets en vie et leur dĂ©placement se fait sans pause, mais le nettoyage de la mĂ©moire en rĂ©clame une. Comme il fait moins de choses pendant les pauses, elles sont plus courtes. Lâactivation se fait via lâoption `-XX:+UseShenandoahGC`. Ce changement est dĂ©crit dans la [JEP 379](https://openjdk.java.net/jeps/379). #### ZGC ZGC se donne pour objectif dâavoir des temps de pause faibles, y compris sur de grands tas (_heap_) de lâordre du tĂ©raoctet. Pour cela, il est capable de dĂ©charger les classes sans arrĂȘter lâexĂ©cution. Tous les ramasseâmiettes actuels de Java effectuent du dĂ©chargement de classes, mais ils sont obligĂ©s de le faire uniquement durant le _stop the world_. ZGC a travaillĂ© pour pouvoir faire cela en concurrence de lâapplication. Il semble que cela a eu des effets de bord positifs, notamment le temps de pause nâest dĂ©pendant que du nombre de fils dâexĂ©cution de lâapplication. Il sâagit de lâamĂ©lioration majeure, mais il y a eu bien dâautres travaux comme le fait de pouvoir rendre de la mĂ©moire au systĂšme dâexploitation, la gestion de tas de 8 Mio jusquâĂ 16 Tio. Actuellement, seuls Windows, macOS et GNU/Linux sur les architectures x86-64 et AArch64 sont pris en charge. Pour lâactiver, câest lâoption `-XX:+UseZGC`. Ce changement est dĂ©crit dans la [JEP 377](https://openjdk.java.net/jeps/377).> _Câest trĂšs bien mais, du coup, comment choisir entre Shenandoah, ZGC ou rester sur G1 ?_ Câest une question bien complexe qui est Ă©videmment trĂšs dĂ©pendante de lâapplication cible. PremiĂšrement, G1, malgrĂ© le fait quâil continue dâĂȘtre amĂ©liorĂ©, est trĂšs loin derriĂšre ZGC et Shenandoah. Les objectifs de ces derniers sont assez similaires et ils sont tellement efficaces quâon ne peut pas voir de diffĂ©rence entre eux quand ils sont comparĂ©s Ă G1... De mon avis personnel et de ce que jâen ai lu : - ZGC est fait pour ĂȘtre simple, il est moins configurable ; - Shenandoah est plus configurable et il offre des temps de pause plus prĂ©dictibles que ZGC. NĂ©anmoins, tout cela peut encore changer dâici la sortie de Java 17 (en septembre 2021). ### Blocs de texte Les blocs de texte arrivent enfin en version dĂ©finitive ([JEP 378](https://openjdk.java.net/jeps/378)). Cette fonctionnalitĂ© a fait beaucoup parler dâelle depuis son introduction en Java 13. Il est donc maintenant possible de dĂ©finir des chaĂźnes de caractĂšres multilignes comme ça : ```java String query = """ SELECT "EMP_ID", "LAST_NAME" FROM "EMPLOYEE_TB" WHERE "CITY" = 'INDIANAPOLIS' ORDER BY "EMP_ID", "LAST_NAME"; """; ``` ### Classes cachĂ©es Cette nouveautĂ© offre la possibilitĂ© aux cadriciels de gĂ©nĂ©rer des classes pour son propre usage qui ne seront pas accessibles de lâextĂ©rieur et ainsi de gĂ©rer la tambouille interne sans risque de fuite, notamment en utilisant la rĂ©flexion. Java possĂšde des classes internes, qui ne sont pas directement exposĂ©es au niveau de lâAPI, mais qui restent accessibles par rĂ©flexion. Ce nâest pas leur nom peu allĂ©chant `Unsafe` qui empĂȘche quâelles soient largement utilisĂ©es par tout un tas de logiciels. Un des objectifs des dĂ©veloppeurs du JDK est de faire en sorte que cette pratique cesse. Un [article de _Java Magazine_](https://blogs.oracle.com/javamagazine/the-unsafe-class-unsafe-at-any-speed) en parle et il y a, bien sĂ»r, la [JEP 371](https://openjdk.java.net/jeps/371) qui dĂ©crit cette Ă©volution. Câest donc une Ă©tape de plus sur la route de la suppression des classes de `sun.misc.Unsafe`. ### Sous le capot - cette version inclut la prise en charge des signatures [EdDSA](https://fr.wikipedia.org/wiki/EdDSA "EdwardsâCurve Digital Signature Algorithm") ([JEP 339](https://openjdk.java.net/jeps/339)) ; - lâAPI `DatagramSocket` bĂ©nĂ©ficie dâune rĂ©implĂ©mentation ([JEP 373](https://openjdk.java.net/jeps/373)). ### En vrac - nouvelles mĂ©thodes pour obtenir une valeur absolue : [JDKâ8241374](https://bugs.openjdk.java.net/browse/JDK-8241374) ; - ajout de Unicode 13 : [JDKâ8239383](https://bugs.openjdk.java.net/browse/JDK-8239383) ; - mise Ă jour Ă la [version 37 de la base Unicode CLDR](http://cldr.unicode.org/index/downloads/cldr-37) pour amĂ©liorer lâinternationalisation de vos logiciels ; - lâAppCDS gĂšre dĂ©sormais les lambdas, ce qui permet [dâaccĂ©lĂ©rer encore un peu](https://twitter.com/gunnarmorling/status/1272454820474085377) le dĂ©marrage de la JVM ; - Les Ă©numĂ©rations peuvent dĂ©sormais contenir 4 103 constantes [JDKâ8241798](https://bugs.openjdk.java.net/browse/JDK-8241798) ! ## AvantâpremiĂšres Les fonctionnalitĂ©s ciâdessous sont considĂ©rĂ©es comme en avantâpremiĂšre (_preview_), elles sont sujettes Ă changement dâune version Ă lâautre. ### Filtrage par motif avec instanceof La [filtrage par motif](https://fr.wikipedia.org/wiki/Filtrage_par_motif) (_pattern matching_) sur `instanceof` ([JEP 383](https://openjdk.java.net/jeps/383)) permet de discriminer un objet selon sa classe et de rĂ©cupĂ©rer une rĂ©fĂ©rence correctement typĂ©e. Un exemple possible serait : ```java Object myVar = foo(); if (myVar instanceof String s) { System.out.println(s); } ``` Cela nâest pas encore disponible avec lâinstruction `switch`. ### Sealed classes Les _sealed classes_ sont des classes dont on contrĂŽle lâhĂ©ritage. Cela permet dâavoir une connaissance Ă la compilation de toutes les classes filles de cette derniĂšre. Le premier gain est de pouvoir sâassurer quâon a gĂ©rĂ© tous les cas dans un `switch` qui vĂ©rifie le type par `instanceof`. Câest dĂ©crit dans la [JEP 360](https://openjdk.java.net/jeps/360). LâĂ©criture est assez diffĂ©rente de ce que lâon trouve en Scala. Ce dernier oblige Ă ce que toutes les classes filles soient dĂ©crites dans le mĂȘme fichier. Java garde la volontĂ© dâavoir (en principe) une seule classe par fichier. Cela sâĂ©crit donc ainsi : ```java package org.linuxfr; public abstract sealed class Contenu permits org.linuxfr.Depeche, org.linuxfr.Journal, org.linuxfr.Lien { // ... } ``` Il faut voir que cela remet en cause les possibilitĂ©s dâĂ©tendre le code. Ăa sert quasi uniquement quand on a besoin de lâ_exhaustive checking_ au sein du _pattern matching_. Pour bien dĂ©crire lâintĂ©rĂȘt, cela permet dâĂ©crire : ```java String foo(Contenu c) { return switch(c) { case Depeche d -> "plouf"; case Journal j -> "plif"; case Lien l -> "plof"; }; } ``` Sans avoir besoin dâavoir un cas `default`. ### Records Les _records_ (apparus dans la prĂ©cĂ©dente version de Java) sont des classes immuables qui bĂ©nĂ©ficient dâune syntaxe succincte. Cette mise Ă jour assure le bon fonctionnement avec les _sealed classes_ et sur lâusage dâannotations, mais la [JEP 384](https://openjdk.java.net/jeps/384) est trĂšs complĂšte pour dĂ©crire tout leur fonctionnement. Pour ce qui est du code un `Point` en deux dimensions se dĂ©clarera comme ça : ```java record Point(int x, int y) {} ``` Et elle sâutilise comme nâimporte quelle classe. Comme pour le constructeur vide créé par dĂ©faut, pour vous ici le langage dĂ©finit le `equals()`/`hashCode()`, les _getter_ (avec un style « _builder_ », dans lâexemple on a `x()` et `y()`), le constructeur avec le profil que vous avez dĂ©fini et une mĂ©thode `toString()`. Comme pour le constructeur par dĂ©faut, il est possible de surcharger les implĂ©mentations fournies. Cela devrait rĂ©duire lâintĂ©rĂȘt de [lombok](https://projectlombok.org/) ou [immutables](https://immutables.github.io/). Cette nouvelle itĂ©ration apporte diverses Ă©volutions plus ou moins discrĂšte : * il y a lâinterdiction dâutiliser `this` dans le constructeur canonique, câest la solution trouvĂ©e pour Ă©viter aux dĂ©veloppeurs peu attentionnĂ©s de faire nâimporte quoi ; * une modification tardive fait que les attributs des _records_ deviennent rĂ©ellement finals et ne peuvent pas ĂȘtre modifiĂ©s par rĂ©flexion [JDKâ8247444](https://bugs.openjdk.java.net/browse/JDK-8247444) ; * la possibilitĂ© de crĂ©er des `records` locaux de la mĂȘme maniĂšre que les classes ; * les [mĂ©canismes de sĂ©rialisation et de dĂ©sĂ©rialisation](https://inside.java/2020/07/20/serializablerecords/) propre et qui, donc, diffĂšrent des classes : * la sĂ©rialisation est basĂ©e seulement sur lâĂ©tat de lâobjet, * la « dĂ©sĂ©rialisation » utilise uniquement le constructeur canonique. La version finale sera certainement livrĂ©e en version 16. # ĂcosystĂšme ## fastâjar Le projet [Quarkus](https://en.wikipedia.org/wiki/Quarkus) est un cadriciel Java alternatif Ă Spring visant lâextrĂȘme performance et Ă ĂȘtre _developer friendly_. Sa version 1.5 propose un nouvel empaquetage pour les applications Java nommĂ© fastâjar. Un fichier au format JAR est une archive ZIP des applications Java contenant les classes compilĂ©es ainsi que quelques fichiers de description et des fichiers de configuration de lâapplication. Il est possible dây inclure les bibliothĂšques utilisĂ©es par lâapplication : câest ce que lâon appelle un fatâjar ou un uberâjar. Câest un peu comme une compilation statique, cela permet de distribuer lâapplication avec un unique fichier (il faut « juste » avoir un JDK installĂ©). La simplicitĂ© de ces uberâjar leur a fait rencontrer un vif succĂšs, mais lâarrivĂ©e de Docker a un peu changĂ© la donne. Le systĂšme de couches de Docker (une image Docker dĂ©pend dâune prĂ©cĂ©dente image dont on a modifiĂ© le contenu) pousse Ă organiser ses images comme suit : 1. lâimage de base contenant le JDK ; 2. on ajoute les dĂ©pendances de lâapplication dans une couche dĂ©diĂ©e ; 3. on ajoute lâapplication dans une autre couche ; 4. si applicable, on ajoute les fichiers de configuration dans une derniĂšre couche. LâidĂ©e sousâjacente est de dĂ©couper les couches en fonction de la frĂ©quence de mise Ă jour : 1. on modifie plus frĂ©quemment sa configuration que lâapplication ; 2. on met Ă jour plus frĂ©quemment lâapplication que ses dĂ©pendances ; 3. on met Ă jour plus frĂ©quemment les dĂ©pendances que le JDK. Cela permet de ne tĂ©lĂ©charger que les derniĂšres couches lors des mises Ă jour. Lors de leurs tests de performance, les dĂ©veloppeurs de Quarkus se sont rendu compte que le temps de dĂ©marrage dâune application uberâjar est bien plus court quâavec les dĂ©pendances sĂ©parĂ©es ([voir ici](https://twitter.com/agoncal/status/1298205802709364737)). Pour pouvoir Ă la fois avoir un empaquetage Java efficace et continuer de suivre les bonnes pratiques Docker, ils ont créé fastâjar. Il sâagit simplement dâun JAR Ă©clatĂ©, mais qui possĂšde un index dans le JAR principal qui indique oĂč trouver chaque classe. Le chargeur de classes nâa donc plus Ă aller chercher dans chaque JAR si la classe quâil cherche sây trouve ou non. ## DĂ©veloppement du JDK La version 16 du JDK donnera quelques modifications importantes dans son dĂ©veloppement : - passage Ă C++14 ([JEP 347](https://openjdk.java.net/jeps/347)) ; actuellement cantonnĂ© Ă C++98, les nouveaux dĂ©veloppements seront effectuĂ©s avec la norme C++14, la JEP dĂ©crit ce qui est autorisĂ© ou non dâutiliser ; - [_devnewton_ en avait parlĂ© dans les liens](https://linuxfr.org/users/devnewton/liens/l-openjdk-abandonne-mercurial-pour-git) : passage de Mercurial Ă Git ([JEP 357](https://openjdk.java.net/jeps/357)), cette dĂ©cision est motivĂ©e par la taille de lâhistorique, lâoutillage autour de Git et les hĂ©bergements disponibles pour Git â justement, dans la foulĂ©e, il a Ă©tĂ© dĂ©cidĂ© de partir chez GitHub ([JEP 369](https://openjdk.java.net/jeps/369)) ; vous trouverez les raisons de ce changement dans la JEP associĂ©e : _[Why GitHub?](https://openjdk.java.net/jeps/369#Why-GitHub?)_ ## Java champions Les _Java Champions_ sont un groupe de promoteurs de Java indĂ©pendants dâOracle (ou de Sun Ă lâĂ©poque). Les membres sont Ă©lus par leurs pairs (et sont aussi proposĂ©s Ă lâĂ©lection de cette façon). Le 5 mai dernier, Audrey Neveu Ă©tait Ă©lue _Java Champion_. Elle travaille chez [Pivotal](https://en.wikipedia.org/wiki/Pivotal_Software) comme dĂ©veloppeuse Java, Kotlinv et JS, et est surtout connue en tant que membre des _[Cast Codeurs](https://lescastcodeurs.com/)_ oĂč elle sensibilise aux enjeux sociĂ©taux que les technologies peuvent poser (les risques liĂ©s aux libertĂ©s, les problĂšmes que les GAFAM peuvent induire...). ## Vingtâcinq ans de Java Le 25 mai dernier Java a soufflĂ© ses vingtâcinq bougies. Ăa a Ă©tĂ© lâoccasion de crĂ©er diffĂ©rents Ă©vĂšnements : par exemple, Oracle a mis en ligne _[Moved by Java](https://www.oracle.com/java/moved-by-java/)_, et ParisJUG a organisĂ© une soirĂ©e rĂ©trospective avec plusieurs champions Java francophones câest [visible sur YouTube](https://www.youtube.com/watch?v=ocQeuV8vejw). On y retrouve pĂȘleâmĂȘle : - [Audrey Neveu](https://twitter.com/audrey_neveu), nouvelle championne ; - [Antonio Gonçalves](https://antoniogoncalves.org/), cofondateur du ParisJUG, de Devoxx France, il travaille pas mal autour de Java EE ; - [Emmanuel Bernard](https://emmanuelbernard.com/), dĂ©veloppeur Red Hat sur les projets Hibernate et maintenant Quarkus ; - [JeanâMichel Doudoux](https://www.jmdoudoux.fr/) il a produit Ă©normĂ©ment de documentations autour de Java, entre autres sur _[Developpez.com](https://jmdoudoux.developpez.com/cours/developpons/java/)_, il en publie aussi sur son [propre site](http://www.jmdoudoux.fr/accueil_java.htm) ; - [RĂ©mi Forax](http://www-igm.univ-mlv.fr/~forax/), enseignant Ă lâuniversitĂ©, il est contributeur OpenJDK depuis trĂšs longtemps. Il y a aussi un article sympa listant [25 superâapplications](https://blogs.oracle.com/javamagazine/the-top-25-greatest-java-apps-ever-written). ## AdoptOpenJDK devient Adoptium AdoptOpenJDK est une distribution de Java trĂšs populaire. Elle a rejoint en juin dernier la [fondation Eclipse](https://blog.adoptopenjdk.net/2020/06/adoptopenjdk-to-join-the-eclipse-foundation/). Il peut ĂȘtre compliquĂ© dâun point de vue lĂ©gal dâutiliser le nom « OpenJDK », il a donc Ă©tĂ© choisi de renommer le projet [Eclipse Adoptium](https://projects.eclipse.org/projects/adoptium). Cela va permettre au projet de bĂ©nĂ©ficier de toute lâinfrastructure proposĂ©e par Eclipse dâun point de vue technique (hĂ©bergement par exemple) et organisationnel (la gouvernance nâest pas attachĂ©e Ă une Ă©ventuelle entreprise).