advanced modular development...#javaone #jigsaw copyright © 2016, oracle and/or its affiliates. all...
TRANSCRIPT
Copyright © 2016, Oracle and/or its affiliates. All rights reserved. |
Advanced Modular Development
Alan Bateman Alex Buckley JavaPlatformGroup,OracleSeptember2016
Copyright © 2016, Oracle and/or its affiliates. All rights reserved. |#JavaOne#Jigsaw
Sessions
Prepare for JDK 9
Introduction to Modular Development
Advanced Modular Development
Modules and Services
Project Jigsaw: Under The Hood
1
3
2
1
2
4
5
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.#JavaOne#Jigsaw
ApplicationMigration
3
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.#JavaOne#Jigsaw
Typicalapplication
4
JAR JAR
JAR
JAR JAR
JARJAR
JAR
JARJAR JAR
JAR
JDK
JARJAR
JAR
JAR
JAR
JAR
JAR
JARJAR
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.#JavaOne#Jigsaw
Typicalapplication
5
JAR JAR
JAR
JAR
JAR
JARJAR JAR
JARJAR
JAR
JAR
JAR
JAR
JAR
JARJAR
modulejava.base
modulejava.logging
modulejava.sql
modulejava.xml
JAR
JAR
JAR
JAR
JAR
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.#JavaOne#Jigsaw 6
jackson-databind-2.6.2.jar
myapp.jar
modulejava.base
modulejava.logging
mylib.jar
modulejava.xml
modulejava.sql
jackson-annotations-2.6.2.jar
jackson-core-2.6.2.jar
SampleScenario
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.#JavaOne#Jigsaw 7
$ java -cp \ lib/myapp.jar:\ lib/mylib.jar:\ lib/jackson-core-2.6.2.jar:\ lib/jackson-databind-2.6.2.jar:\ lib/jackson-annotations-2.6.2.jar\ myapp.Main
Runningmyapplication
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.#JavaOne#Jigsaw 8
jackson-databind-2.6.2.jar
modulemyapp
modulemylib
jackson-annotations-2.6.2.jar
jackson-core-2.6.2.jar
Migratingfromthetopdown
modulejava.base
modulejava.logging
modulejava.xml
modulejava.sql
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.#JavaOne#Jigsaw
Migratingfromthetopdown
• modulemyapprequires?
• modulemyappexports?
• modulemylibrequires?
• modulemylibexports?
9
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.#JavaOne#Jigsaw 10
$ jdeps -s lib/myapp.jar lib/mylib.jarmyapp.jar -> lib/jackson-core-2.6.2.jarmyapp.jar -> lib/jackson-databind-2.6.2.jarmyapp.jar -> mylib.jarmyapp.jar -> java.basemyapp.jar -> java.sqlmylib.jar -> java.base
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.#JavaOne#Jigsaw 11
// src/mylib/module-info.javamodule mylib { requires java.base; exports com.myapp.lib.util to myapp;}
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.#JavaOne#Jigsaw 12
// src/myapp/module-info.javamodule myapp { requires mylib; requires java.base; requires java.sql; ??? requires jackson.core ??? ??? requires jackson.databind ???}
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.#JavaOne#Jigsaw 13
Ifonly…
jackson-databind-2.6.2.jar
jackson-core-2.6.2.jar
jackson-annotations-2.6.2.jar
modulejackson.core
modulejackson.databind
modulejackson.annotations
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.#JavaOne#Jigsaw 14
// src/myapp/module-info.javamodule myapp { requires mylib; requires java.base; requires java.sql; requires jackson.core; requires jackson.databind;}
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.#JavaOne#Jigsaw 15
modulejackson.databind
modulemyapp
modulejava.base
modulejava.logging
modulemylib
modulejava.xml
modulejava.sql
modulejackson.annotations
modulejackson.core
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.#JavaOne#Jigsaw
Automaticmodules
• “Real”modules
• Nochangestosomeoneelse’sJARfile:-)
• ModulenamederivedfromJARfilename
• Exportsallitspackages• Requiresallothermodules
16
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.#JavaOne#Jigsaw 17
modulemyapp
modulemylib
modulejackson.databind
modulejackson.annotations
modulejackson.core
modulejava.xml
modulejava.sql
modulejava.logging
modulejava.base
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.#JavaOne#Jigsaw 18
modulemyapp
modulemylib
modulejackson.databind
import com.fasterxml.jackson.databind.ObjectMapper;...ObjectMapper mapper = new ObjectMapper();MyValue value = mapper.readValue("{\"name\":\"Bob\", \"age\":13}", MyValue.class);
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.#JavaOne#Jigsaw 19
// src/myapp/module-info.javaweak module myapp { requires mylib; requires java.base; requires java.sql; requires jackson.core; requires jackson.databind;}
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.#JavaOne#Jigsaw 20
modulemyapp
modulemylib
modulejackson.databind
modulejackson.annotations
modulejackson.core
modulejava.xml
modulejava.sql
modulejava.logging
modulejava.base
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.#JavaOne#Jigsaw 21
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.#JavaOne#Jigsaw
$ javac --module-path lib --module-source-path src -d mods …
$ jar --create --file mlib/mylib.jar -C mods/mylib .
$ jar --create --file mlib/myapp.jar -C mods/myapp . \ --main-class myapp.Main
22
lib/jackson-core-2.6.2.jarlib/jackson-databind-2.6.2.jarlib/jackson-annotations-2.6.2.jar
src/myapp/module-info.javasrc/myapp/...
src/mylib/module-info.javasrc/mylib/...
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.#JavaOne#Jigsaw 23
$ java --module-path mlib:lib —m myapp
$ java -cp \ lib/myapp.jar:\ lib/mylib.jar:\ lib/jackson-core-2.6.2.jar:\ lib/jackson-databind-2.6.2.jar:\ lib/jackson-annotations-2.6.2.jar \ myapp.Main
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.#JavaOne#Jigsaw
LibraryMigration
24
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.#JavaOne#Jigsaw 25
jackson-databind-2.6.2.jar
myapp.jar
modulejava.base
modulejava.logging
mylib.jar
modulejava.xml
modulejava.sql
jackson-annotations-2.6.2.jar
jackson-core-2.6.2.jar
SampleScenario
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.#JavaOne#Jigsaw 26
modulejackson.databind
myapp.jar
modulejava.base
modulejava.logging
mylib.jar
modulejava.xml
modulejava.sql
modulejackson.annotations
modulejackson.core
Migratingfromthebottomup
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.#JavaOne#Jigsaw
Migratingfromthebottom
• modulejackson.corerequires?
• modulejackson.coreexports?
• modulejackson.databindrequires?
• modulejackson.databindexports?
• modulejackson.annotationsrequires?
• modulejackson.annotationsexports?
27
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.#JavaOne#Jigsaw
Requires?
28
$ jdeps -s lib/jackson*.jar jackson-annotations-2.6.2.jar -> java.base jackson-core-2.6.2.jar -> java.base jackson-databind-2.6.2.jar -> lib/jackson-annotations-2.6.2.jar jackson-databind-2.6.2.jar -> lib/jackson-core-2.6.2.jar jackson-databind-2.6.2.jar -> java.base jackson-databind-2.6.2.jar -> java.sql jackson-databind-2.6.2.jar -> java.xml
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.#JavaOne#Jigsaw 29
jackson.databind
jackson.corejava.sql
jackson.annotations java.xml
java.base
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.#JavaOne#Jigsaw
Creatingthemodule-info.javaforeachmodule
30
$ jdeps —-gen-module-info src *.jar writing to src/jackson.annotations/module-info.java writing to src/jackson.databind/module-info.java writing to src/jackson.core/module-info.java
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.#JavaOne#Jigsaw 31
// src/jackson.databind/module-info.java module jackson.databind { requires transitive jackson.annotations; requires transitive jackson.core; requires java.logging; requires transitive java.sql; requires transitive java.xml; exports com.fasterxml.jackson.databind; exports com.fasterxml.jackson.databind.annotation; exports com.fasterxml.jackson.databind.cfg; exports com.fasterxml.jackson.databind.deser; exports com.fasterxml.jackson.databind.deser.impl; exports com.fasterxml.jackson.databind.jsontype; exports com.fasterxml.jackson.databind.jsontype.impl; exports com.fasterxml.jackson.databind.module; exports com.fasterxml.jackson.databind.node; exports com.fasterxml.jackson.databind.ser; exports com.fasterxml.jackson.databind.ser.impl; exports com.fasterxml.jackson.databind.ser.std; exports com.fasterxml.jackson.databind.type; exports com.fasterxml.jackson.databind.util; }
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.#JavaOne#Jigsaw 32
// src/jackson.databind/module-info.java module jackson.databind { requires transitive jackson.annotations; requires transitive jackson.core; requires java.logging; requires transitive java.sql; requires transitive java.xml; exports com.fasterxml.jackson.databind; exports com.fasterxml.jackson.databind.annotation; exports com.fasterxml.jackson.databind.cfg; exports com.fasterxml.jackson.databind.deser; exports com.fasterxml.jackson.databind.deser.impl; exports com.fasterxml.jackson.databind.jsontype; exports com.fasterxml.jackson.databind.jsontype.impl; exports com.fasterxml.jackson.databind.module; exports com.fasterxml.jackson.databind.node; exports com.fasterxml.jackson.databind.ser; exports com.fasterxml.jackson.databind.ser.impl; exports com.fasterxml.jackson.databind.ser.std; exports com.fasterxml.jackson.databind.type; exports com.fasterxml.jackson.databind.util; }
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.#JavaOne#Jigsaw 33
src/jackson.core/module-info.java src/jackson.core/...
src/jackson.databind/module-info.java src/jackson.databind/...
src/jackson.annotations/module-info.java src/jackson.annotations/...
$ javac --module-source-path src -d mods $(find src -name “*.java”)
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.#JavaOne#Jigsaw 34
$ javac --module-source-path src -d mods ...
$ jar --create --file mlib/jackson-core-2.6.2.jar \ —-module-version 2.6.2 -C mods/jackson.core .
$ jar --create --file mlib/jackson-databind-2.6.2.jar \ —-module-version 2.6.2 -C mods/jackson.databind .
$ jar --create --file mlib/jackson-annotations-2.6.2.jar \ —-module-version 2.6.2 -C mods/jackson.annotations .
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.#JavaOne#Jigsaw 35
modulejackson.databind
modulejava.logging
modulejava.sql
modulejackson.core
modulejackson.annotations
myapp.jar mylib.jar
modulejava.base
modulejava.xml
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.#JavaOne#Jigsaw 36
$ java -cp \ lib/myapp.jar:\ lib/mylib.jar:\ lib/jackson-core-2.6.2.jar:\ lib/jackson-databind-2.6.2.jar:\ lib/jackson-annotations-2.6.2.jar \ myapp.Main
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.#JavaOne#Jigsaw 37
$ java --module-path mlib \ --add-modules jackson.databind \ -cp lib/myapp.jar:lib/mylib.jar myapp.Main
$ java -cp \ lib/myapp.jar:\ lib/mylib.jar:\ lib/jackson-core-2.6.2.jar:\ lib/jackson-databind-2.6.2.jar:\ lib/jackson-annotations-2.6.2.jar \ myapp.Main
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.#JavaOne#Jigsaw
Puttingitalltogether
38
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.#JavaOne#Jigsaw 39
modulejackson.databind
modulejava.logging
modulejava.sql
modulejackson.core
modulejackson.annotations
modulejava.base
modulejava.xml
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.#JavaOne#Jigsaw 40
modulejackson.databind
modulejava.logging
modulejava.sql
modulejackson.core
modulejackson.annotations
modulejava.base
modulejava.xml
modulemyapp
modulemylib
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.#JavaOne#Jigsaw 41
$ ls -1 mlib myapp.jar mylib.jar jackson-core-2.6.2.jar jackson-databind-2.6.2.jar jackson-annotations-2.6.2.jar
$ java --module-path mlib -m myapp
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.#JavaOne#Jigsaw
Linking
42
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.#JavaOne#Jigsaw 43
$ jlink --module-path $JDKMODS:mlib --add-modules myapp \ --compress=2 --strip-debug —-output myimage
$ du -ks myimage 26000 myimage
$ ls myimage/bin myapp java keytool
$ myimage/bin/java --list-modules myapp mylib [email protected] [email protected] [email protected] java.base@9 java.logging@9 java.sql@9 java.xml@9
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.#JavaOne#Jigsaw 44
$ myimage/bin/java -m myapp Greetings from myapp, here’s some json!
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.#JavaOne#Jigsaw 45
$ myimage/bin/myapp Greetings from myapp, here’s some json!
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.#JavaOne#Jigsaw
Summary
• Freedomtoadoptmodulesatyourownpace
• Modularizeyourapplicationbeforeitslibraries
• Modularizelibrariesindependently
• Differentkindsofmodules
• Explicitvs.automatic
• Strongvs.weak
46
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.#JavaOne#Jigsaw 47
Goforthandmodularize!
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.#JavaOneJigsaw
Othersessions,mostlythisroom• PrepareforJDK9:[email protected]
• IntroductiontoModularDevelopment:Wed@3pm
• ModulesandServices:[email protected],[email protected]
• ProjectJigsaw:UnderTheHood:Tues@4pm
• ProjectJigsawHackSession:[email protected]
48
Copyright©2016,Oracleand/oritsaffiliates.Allrightsreserved.#JavaOne#Jigsaw 49
MoreInformation
OpenJDKProjectJigsaw
http://openjdk.java.net/projects/jigsaw/
mailto:[email protected]
EarlyAccessBuilds
https://jdk9.java.net/jigsaw/
Copyright © 2016, Oracle and/or its affiliates. All rights reserved. |
Safe Harbor Statement
The preceding is intended to outline our general product direction. It is intended for information purposes only, and may not be incorporated into any contract. It is not a commitment to deliver any material, code, or functionality, and should not be relied upon in making purchasing decisions. The development, release, and timing of any features or functionality described for Oracle’s products remains at the sole discretion of Oracle.
50