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
• 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.
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
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
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
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
Top Related