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

Transcript
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