208-04-20 - Java 9 et 10 - javaetmoi.com

6
Après Java 8, Java 9 et 10 Speakers : Jean-Michel Doudoux (Oxiane) Format : Conférence Date : 20 avril 2018 Introduction Beaucoup de choses bougent en ce moment au niveau du langage Java. La version 8 de Java a apporté beaucoup de nouveautés. Il y’a eu un réel engouement pour Java 8. Preuve en est, d’après l’index TIOBE, Java est redevenu le langage de l’année en 2015. Java 9 Java 9 est la version la plus controversée de l’histoire de Java car le JCP a voté non pour la première fois. Les principales fonctionnalités Le système de module JPMS (Java Platform Module System) issu du projet Jigsaw 89 JEPs : évolutions mineures, des API, des outils Java 9 vient avec un nouveau modèle de releases : 2 releases majeures de Java par an via OpenJDK. Java 11 arrive en septembre 2018. Oracle propose un modèle LTS : 1 version tous les 3 ans à partir de Java 11. Java 9 et 10 ne sont pas LTS. Les a priori Classpath et module-path cohabitent Le code d’une application ne doit pas obligaoirement être modularisé La classe sun.misc.Unsafe n’est finalement pas retirée Une application Java 8 compile en Java 9 : çà dépend Une application Java 8 s’exécute en Java 9 : çà dépend Améliorations Méthode private dans les interfaces Variables finales API et outils Process API Flow API Fabriques pour collection immuable Var Handles (remplace partiellement Unsafe) Enrichissement de CompletableFuture

Transcript of 208-04-20 - Java 9 et 10 - javaetmoi.com

Page 1: 208-04-20 - Java 9 et 10 - javaetmoi.com

AprèsJava8,Java9et10Speakers:Jean-MichelDoudoux(Oxiane)Format:ConférenceDate:20avril2018IntroductionBeaucoupdechosesbougentencemomentauniveaudulangageJava.Laversion8deJavaaapportébeaucoupdenouveautés.Ily’aeuunréelengouementpourJava8.Preuveenest,d’aprèsl’indexTIOBE,Javaestredevenulelangagedel’annéeen2015.Java9Java9estlaversionlapluscontroverséedel’histoiredeJavacarleJCPavoténonpourlapremièrefois.Lesprincipalesfonctionnalités

• LesystèmedemoduleJPMS(JavaPlatformModuleSystem)issuduprojetJigsaw• 89JEPs:évolutionsmineures,desAPI,desoutils

Java9vientavecunnouveaumodèledereleases:2releasesmajeuresdeJavaparanviaOpenJDK.Java11arriveenseptembre2018.OracleproposeunmodèleLTS:1versiontousles3ansàpartirdeJava11.Java9et10nesontpasLTS.Lesapriori

• Classpathetmodule-pathcohabitent• Lecoded’uneapplicationnedoitpasobligaoirementêtremodularisé• Laclassesun.misc.Unsafen’estfinalementpasretirée• UneapplicationJava8compileenJava9:çàdépend• UneapplicationJava8s’exécuteenJava9:çàdépend

Améliorations

• Méthodeprivatedanslesinterfaces• Variablesfinales• …

APIetoutils

• ProcessAPI• FlowAPI• Fabriquespourcollectionimmuable• VarHandles(remplacepartiellementUnsafe)• EnrichissementdeCompletableFuture

Page 2: 208-04-20 - Java 9 et 10 - javaetmoi.com

• JavaDocenHTML5avecrecherche• JShell

AméliorationsdelaJVM

• Globalementdemeilleursperformances:o CompactStringo ConcaténationdeStringavecInvokeDynamico G1commeGCpardéfauto Codecompilérépartidansducacheséparé

• UnificationduloggingdelaJVMLesmodules

• Lesmodulessontperçuscommecontraignantso Pasdesplitpackageo Pasd’accèspardéfautauxclassespubliquesd’unmoduleo Nécessitédedéfinirlesdépendancesdanslemodule-infoETdanslesoutilsde

build(Maven)• Avantagesdesmodules:

o Encapsulationforte§ Améliorationdelasécuritéetdelamaintenabilité

o Uneconfigurationfiable§ Réduitlesproblèmesdeclasspathhell.LaJVMpeutdétecterles

modulesmanquant(maispaslaversion…)o Occasionderemettredel’ordre

§ Dansledesigndeslivrables§ Danslesdépendances§ DanslesAPIutilisées

• 4typesdemoduleso Platformmodules:modulesduJREo Unnamedmodule:modulesregroupanttouteslesclasses/JARduclasspatho AppNamedmodules:jarmodulairedanslemodulepatho Automaticmodules:JARnonmodulairedanslemodulepath

RuntimepersonnaliséL’outilJavaLinker(jlinker)permetdecréerunJREpersonnaliséàpartirdesmodulesutilisésparl’application.Pourfonctionner,cetoutilnécessitequetouslesJARsdoiventêtremodulaires,cequin’estpaspourtoutdesuite.MigrationversJava9FaireunétatdeslieuxFaireunecartographiedesdépendancespourvérifiers’ilexisteuneversionmodulaire.Utilisationdel’outilJdepsduJDKpourcartographierlesdépendances.Jdepsanalysestatiquementlebytecode(travaillesurles.classetles.jar)Permetégalementdedétecterlessplitpackages.

Page 3: 208-04-20 - Java 9 et 10 - javaetmoi.com

Jdepspermetdecréerlemodule-infod’unJARdonné,avecpossibilitédeleretouchermanuellementaprès.Migrationd’unebibliothèque2stratégies:1. Conversionenmoduled’unJAR

• Ajoutd’unfichiermodule-info2. Sansconversionenmodule

o Nécessitédefigersonnomvial’attributAutomatic-Module-Name.Sinon,lenomestdéterminéautomatiquementàpartirdunomduJAR.

Quelquesoitlastratégieadoptée,bientesteravecclasspathetmodulepath.Raison:leurscomportementspeutdifférer.PourquoinepasresterenJava4,5,6,7ou8?

• Plusdesupportd’Oracle• PlusdemiseàjourgratuitesdeJRE• Nepermetpastoujoursd’upgraderdeslibrairies

Pourquoinepasmigrerversuneautretechno?PourquelROI?LecoutdemigrationversJava9resterabieninférieure.Stratégieviable:attentelaprochaineLTSAl’avenir,ilvafalloirchoisirentrelemodèlegratuitoulesupportpayant

• ModèleLTS:support(nongratuit)longueduréeproposéeparOracleMigrerverslesmodulesSolutioncible:lesmodules.Nécessitéd’ajouterunmodule-infoàchaqueJAR.Problèmedesdépendancesetdesdépendancestransitivesutilisées.OnpeutmigreràJava9sanslesmodules.Ilestpossibleden’utiliserqueleclasspathcommeenJava8Solutionintermédiaire:migrationincrémentale.Modularisercomplètementoupartiellementl’application.Continueràutiliserdesbibliothèquesnonmodulairesletempsqu’ellessemettentàjour.L’outiljarpermetdesavoirsiunJARestmodulaireoupasavecl’option--describe-module.SurunJARmodulaire,ildonnelenomautomatique.L’option--illegal-accesspermetd’autoriserounonl’accèsparintrospectionparleunnamedmodule.Pardéfaut,l’optionestàpermit(touslesaccèssontautorisés).FaitperdreunepartiedesbénéficesdeJPMS.Atermes,lavaleurpardéfautserapasséeàdeny.Jean-Michelnousconseilledenepasignorerlewarning.4valeurspossibles:warning,debug,deny,permit

Page 4: 208-04-20 - Java 9 et 10 - javaetmoi.com

PourassouplirJPMS,ily’a5optionsauniveaudelaJVMouducompilateur:1. –add-module2. –add-reads3. –add-exports4. –add-open5. –patch-module:permetd’ajouterdesclassesdansunmoduleCesoptionsnemodifientpaslemodule-info.Attentionànepasabuserdeleurutilisation.

Multi-ReleaseJAR(MRJAR)Permetd’étendreleformatJAR:incluredesclassesspécifiquesde.classpourd’autresversionsdeJavadansunmêmefichierjarUnjarpeutcontenirplusieurs.classpourdifférentesversions

Page 5: 208-04-20 - Java 9 et 10 - javaetmoi.com

OutiljdeprscanAnalysestatiquedes.classpourrechercherlesAPIdeprecatedJava11varetirerdesméthodes.Cequin’étaitpaslecasjusque-là.L’applicationnefonctionneraplus.LesincompatibilitéL’identifiant_n’estplusvalide.Lesmécanismesd’endorsedetd’extensionsontretirés.LeJREetleJDKontdésormaislamêmestructurederépertoire.LesAPIinternesLaplupartdesAPIinternessontencapsulées.Ledéveloppeurn’yaplusaccès.Certainessontremplacées(ex:sun.misc.BASE64Decoderparjava.util.Base64).D’autresvontdisparaitre(ex:Unsafe)L’outiljdepsavecl’option--jdkinternalsproposeunesolutionderemplacementsielleexiste.Lesdépendancescycliques

• LesJARSnonmodulairespeuventavoirdesdépendancescycliqueso Pasunebonnepratiqueo Maiscourantdansleclasspath

• Ilvaêtrenécessairedeleséliminer.• Nefonctionneniàlacompilationniauruntime

Splitpackages

• UnmêmepackageJavaprésentdansplusieursJAR• Courantdansleclasspath• InterditparJava9pourfiabilisélaconfiguration• S’appliquepourlespackagesdanslesmodulesdesmodulesexportésouNON

Nouveauformatdeversion

• LaversiondeJavaestparfoisutiliséepourdemauvaisesraisons• LeformatdeversionchangeenJava9• ÇaarechangéunpeuenJava10• Solutions:utiliserl’APIRuntime.VersionouleMRJAR

LesmodulesJavaEE

• LesmodulesJavaEEnesontpluschargéspardéfaut:JAXB,JAX-WS• Depréférence,utilisezunelibrairieexternecarellesserontretiréesdeJava11

Page 6: 208-04-20 - Java 9 et 10 - javaetmoi.com

Java10Arrivé6moisaprèsJava9.Seulement12JEPs.ArenduJava9obsolèteL’inférencedetypepourladéclarationdevariableslocalesavecvarAttention:varn’estpasunmotcléCodequicompile:varvar="Bonjour";Parcontre,uneclasseappeléevarnecompileraplus.Préconisation:utiliservaravecdiscernement.Lecodepeutêtreplusoumoinslisible.Lenommagedesvariablesestprimordial.MeilleursupportdeDocker:

• OptionUseContainerSupport(Linuxuniquement)Conclusion

• Javaévolue,nousdevons(devrons)suivre• LamigrationversJPMSetlesmodulesseraobligatoiretôtoutard

o Ellevaêtredélicateetlongueo Plusieursstratégiessontpossibles

• OracleproposeunguidedemigrationversJava9