Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.|
Pi@allsofMigraCngprojectstoJDK9CON4123
PavelBucekOracleSeptember,2016
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.|
SafeHarborStatementTheprecedingisintendedtooutlineourgeneralproductdirecCon.ItisintendedforinformaConpurposesonly,andmaynotbeincorporatedintoanycontract.Itisnotacommitmenttodeliveranymaterial,code,orfuncConality,andshouldnotberelieduponinmakingpurchasingdecisions.Thedevelopment,release,andCmingofanyfeaturesorfuncConalitydescribedforOracle’sproductsremainsatthesolediscreConofOracle.
4
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.|
IntroducCon,moCvaCon,agenda
• ProjectJersey– hTps://jersey.java.net– ReferenceimplementaConofJAX-RS:JSR311,339,370– Started10yearsago– Mavenproject,170+mavenmodules,700+javapackages,2100+classes,…
• MoCvaCon– Wewanttobeanenabler,notblocker(whenthinkingaboutadopConofJava9)– jlinkpromisesgreatvalueinmicroserviceworld
5
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.|
IntroducCon,moCvaCon,agenda
• Agenda– Goingthroughcompile,test,run,packageonJava9• Jigsawway,nocheatsJ
– IterateoverissuesandsoluCons– Jlink– Conclusion
6
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.|
Jigsaw
• StandardmodulesystemfortheJavaSEpla@orm– AnditsapplicaContoJDK!
• Goals– MaketheJDKeasilyscalabledowntosmallcompuCngdevices– ImprovethesecurityandmaintainabilityoftheJavaSEPla@ormimplementaCon(AndtheJDK)– EnableimprovedapplicaConperformance– MakeiteasierfordeveloperstoconstructandmaintainlibrariesandscaleapplicaCons
7
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.|
Jigsaw
• No-Goals– Versioningsupport• Toocomplextodoitnow,postponed
– SupportforfinegraindefiniConofautomaCcmodules– “Mavencentral”likemodulerepository
8
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.|
Jigsaw
• ModuleisabaseelementofJigsawrunCme• Eachmodulecandeclare– Dependenciesonothermodules• TransiCve,staCc,syntheCc,mandated
– Exportedpackages(!)– UsedServices– ProvidedServices(formerlyMETA-INF/services)
• (thereisnoversion)– (itCANbeaddedlaterby“jar”command)
9
Whatisamodule?
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.|
Jigsaw
10
module my.module {
requires java.base;
requires transitive javax.ws.rs.api;
exports org.my.module.package;
exports org.my.module.package to moduleName;
uses org.my.module.package.InterfaceName;
provides org.my.module.package.InterfaceName with
org.my.module.package.ImplName;
}
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.|
Jigsaw
• BuildingwithoutanymodificaCons– ResultsinCNFE(someJAX-Bclass),whichisexpected– Canbefixedby–XaddReads(orotherversionofthisparameters)– “unnamedmodule”• JigsawisusedonlyforJDKitself
– Goal:MakeJerseyMavenmodulesJigsawmodules.
11
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.|
Build
• Mapping– Mavenmodule(groupId:arCfactId)toJigsawmodulename– MavendependenciestoJigsaw“requires”– ExporCngpackages– META-INF/services/*toprovidesXwithY;
• DeclaringServiceinterfaces
• Jerseyhas170+modules…
12
BacktoJersey
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.|
Build
• Mavenmodule(groupId:arCfactId)toJigsawmodulename– groupId.arCfactId+(s/-/./g)
• META-INF/services/*toprovidesXwithY;• ExporCngpackages– Exportallfornow
13
BacktoJersey
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.|
Build
• MavendependenciesmappingtoJigsaw“requires”– Mavendependencyscopes:compile,provided,runCme,opConal,system,..– Jigsawrequirescanbe:transiCve,staCc
• ThereisnodirectmappingforMavensopConalandprovidedscopes• Easywayoutistomapalldependenciesto“transiCve”,whichmeans“requirestransiCve”– Okfornow,we’llgetbacktothatlater
14
BacktoJersey
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.|
Build
• Classpath– Goodoldclasspath,modelledasthe“unnamedmodule”– Requireseverything,exportsnone
• Modulepath– Whenamodule(jar,exploded,..)isonmodulepath,itistreatedasamodule– Whenajarwithoutmodule-info.javaisonmodulepath,itistreatedasanautomaCcmodule• Exportsallpackages,Requiresallmodulesonthemodulepath(*)• Namederivedfromthejarname
15
ClasspathvsModulepath
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.|
Build
• HowtobuildJava9module?– javac–target9–source9–p$CP–mp$MP$(find.-name"*.java”)
• Mavensupport–compilerpluginversion“3.6-jigsaw-SNAPSHOT”– Putdependenciesonthemodulepathinsteadofclasspath
16
BacktoJersey
--class-path <path>, -classpath <path>, -cp <path> Specify where to find user class files and annotation processors --module-path <path>, -p <path>, -modulepath <path> Specify where to find application modules
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.|
Build
17
PlaAormmodules
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.|
Build
18
PlaAormmodules
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.|
Build
• Trivialbuildissues– Add“requires”forjavapla@ormmodules• java.logging,java.naming,java.acCvaCon,java.xml.bind,java.desktop,java.management
– OSGibundlepluginandotherstuff• Exclude,itwon’tworkanyway• hTp://openjdk.java.net/projects/penrose/• “ThegoalistoexploreandimplementinteroperabilitybetweenOSGiandJigsaw.”
– Mavenshadeplugin– JAXBMavenplugin
• TestcompilaCon(let’sskipitfornow)
19
BacktoJersey
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.|
Build
• Singlepackagecanbeprovidedonlybyasinglemodule
20
BacktoJersey–Servletdependencies
jersey-container-servlet
jersey-container-servlet-core
javax.servlet-api:3.0.1[provided]
servlet-api:2.4[provided]
jersey-server javax.ws.rs.apijersey-common
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.|
Build
• Singlepackagecanbeprovidedonlybyasinglemodule
21
BacktoJersey–Servletdependencies
jersey-container-servlet-3x
jersey-container-servlet-corejavax.servlet-api:3.0.1[provided]servlet-api:2.4[provided]
jersey-server javax.ws.rs.apijersey-common
jersey-container-servlet-2x
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.|
Build
• Singlepackagecanbeprovidedonlybyasinglemodule– Having2moduleswhichexportsamepackageisanerror
• appengine.apijar(automaCcmodule)includesjavax.acIvaIon,[email protected]– ThisisanogoinJigsaw
• Weld(2.2.14.Final)– [ERROR]…/module-info.java:moduleXreadspackageorg.jboss.weld.contextfrombothweld.core.implandweld.api
– SCllthesameissue
22
Splitpackageissue
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.|
Build
• JavaEEAPI– CombinaConofallJavaEEspecAPIs
23
BacktoJersey–JavaEEAPIversus<anyspec>(javax.ws.rs.apiinthiscase)
javax/annotaConjavax/annotaCon/securityjavax/annotaCon/sqljavax/batchjavax/decoratorjavax/ejbjavax/eljavax/enterprisejavax/enterprise/concurrentjavax/enterprise/contextjavax/enterprise/deployjavax/enterprise/event
javax/enterprise/injectjavax/enterprise/uCljavax/facesjavax/injectjavax/interceptorjavax/jmsjavax/jsonjavax/jwsjavax/mailjavax/managementjavax/persistencejavax/resource
javax/securityjavax/servletjavax/transacConjavax/validaConjavax/websocketjavax/ws/rsjavax/xml/bindjavax/xml/registryjavax/xml/rpcjavax/xml/soapjavax/xml/ws…(lotsofsub-packages)
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.|
Build
24
JavaEEAPIjarversus<anyspec>(javax.ws.rs.apiinthiscase)
UserApplicaCon
ApplicaConServer
javax:javaee-api:7.0
javax.websocket:javax.websocket-api
javax.inject:javax.inject
javax.batch:javax.batch-api
javax.ws.rs:javax.ws.rs-api
…
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.|
Build
25
JavaEEAPIjarversus<anyspec>(javax.ws.rs.apiinthiscase)
UserApplicaCon(Jigsawmodule)
ApplicaConServer
javax:javaee-api:7.0
javax.websocket:javax.websocket-api
javax.inject:javax.inject
javax.batch:javax.batch-api
javax.ws.rs:javax.ws.rs-api
…
requiresjavaee.apiautomaCcmodule
requiresjavax.websocket.api;requiresjavax.inject;requiresjavax.ws.rs.api;…
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.|
Build
26
JavaEEAPIjarversus<anyspec>(javax.ws.rs.apiinthiscase)
modulejavaee-api(aggregatormodule,noclasses!)
javax.websocket:javax.websocket-api
javax.batch:javax.batch-api
javax.ws.rs:javax.ws.rs-api
…
requirestransientjavax.batch.api
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.|
Build
• PartofJavaEEAPIwhichisincludedintheJDK– SimilarlyasJAX-B,JAX-WS,Corba,TransacCons,…
• Jerseydependsonjavax.annotaCon-api:1.2• JDKincludesversion<1.2(modulejava.annotaCons.common)• @[email protected]• java.se.eerequiresjava.annotaCons.common
27
BacktoJersey–javax.annotaIon–“commonannotaIons”
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.|
Build
• Jerseyuseshk2asDIframework• exportspackageName;doesn’tguaranteeaccesstoprivateobjects/fields– Itusedto..LastweekJ
• Mavenwarplugin– XStreamserializaConlibrary
28
exportsprivate
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.|
ServiceLoader
• META-INF/services– usesX;//Xisaninterface– providesXwithY//Xisaninterface,YisanimplementaConclass
• Jerseyuseslightlymorecomplex– InternalAPIforlookingupclasses(addingimplementaConsininjecConfwbindingphase)• Classesarelookedupfromdifferentmodule->missinguses->cannotbedeclaredsincetheifacenameisnotknown
– ReflecConfortherescue– Class.getModule().addUses(…)
29
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.|
Whathavewebuilt?
30
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.|
BuildSummary
• 126modules– CausaliCes• Bundles• AllWarexamples• OSGiandmulCmoduletests
• Let’strytoruntheexample!– Mavenexecplugin– IDEsupport– …?
31
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.|
Run
• Let’srunhelloworldexample!
32
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.|
Test
• AutomatedtesCng• Mavencompileplugin– Brokenwithlatestjdkbuild
• Mavensurefireplugin– Doesn’tseemtobereadyyet
• Fullmanualapproachsincenow
33
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.|
Jlink
• ToolwhichproducesopCmizedrunCmeforspecificusecase• PackagingminimalsetfromJDKwiththeapplicaCon– $jlink--module-path$JAVA_HOME/jmods/:"$MP"--add-modulesorg.glassfish.jersey.examples.helloworld--output./jlink-test– Error:module-info.classnotfoundforjavax.annotaCon.apimodule
• Jlinkrequiresallmodulestobenamedmodules– L
34
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.|
Packaging
• Jerseyprovidesjax-rs-ribundle• What’sabundle?– Fatjar
• ExecutableFatJar– L
• ExecutableUberJar!– Whatthehellisanuberjar?
35
Bundles..
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.|
UberJAR
• Originallyajar,whichhasalldependenciesin/lib– ClasspathelementinMETA-INF/MANIFEST.MF
• WhenappliedtoJigsaw– Eachmodulehasitsowndirectory– NewmainclassdefiniCon(module/class)– ModuleFinderimplementaCon
36
Bundles..
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.|
UberJAR&Jlink
• CreateJlinkimagewithsubsetofpla@ormmodulesandusethattorunouruberjar– jlink--module-path=$JAVA_HOME/jmods--add-modulesjava.logging,java.naming,java.acCvaCon,java.xml.bind,java.desktop,java.management--output./jlink
37
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.|
TODO
• UserequirestransiIveonlywhererequired– Onlywhenthedependencyisexposedinexportedpackage
• exportsXtoY;– Exportinternalpackagesstrictlytoorg.glassgish.jersey.*modules– Yisrequiredtobeonthemodulepath
• DistribuConpackages– UsemulC-releasesupportinJARfiles– DistributeJava9enabledJerseyJARs
38
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.|
Mostofthecreditsgoesto…
• AlexBuckley• AlanBateman
• WeretogetlatestJigsawbuild– hTps://jdk9.java.net/jigsaw/
39
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.|
Wasitworthit?
• Java9issCllevolving– Non-compaCblechanges– Missingtoolingsupport
• Java9readyproject• Noshareableresults
40
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.|
Contacts/QA
• PavelBucek([email protected])• Jersey/JAX-RSRI:hTp://jersey.java.net– [email protected]
FeelfreetoaskanyquesConsnoworcontactmelater.
41
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.| 42