Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Project Jigsaw in JDK 9: Modularity Comes To Java

37,166 views

Published on

Video and slides synchronized, mp3 and slide download available at URL http://bit.ly/1WCnj0v.

Simon Ritter looks at the fundamentals of how modularity in Java works. He explains the impact project Jigsaw has on developers in terms of building their applications, as well as helping them to understand how things like encapsulation will change in JDK 9. Filmed at qconlondon.com.

Simon Ritter is the Deputy CTO at Azul and was previously a Java Technology Evangelist at Oracle Corporation. He continues to develop demonstrations that push the boundaries of Java for applications like gestural interfaces.

Published in: Technology

Project Jigsaw in JDK 9: Modularity Comes To Java

  1. 1. © Copyright Azul Systems 2016 © Copyright Azul Systems 2015 @speakjava azul.com Project Jigsaw in JDK 9: Modularity Comes To Java Simon Ritter Deputy CTO, Azul Systems 1
  2. 2. InfoQ.com: News & Community Site • 750,000 unique visitors/month • Published in 4 languages (English, Chinese, Japanese and Brazilian Portuguese) • Post content from our QCon conferences • News 15-20 / week • Articles 3-4 / week • Presentations (videos) 12-15 / week • Interviews 2-3 / week • Books 1 / month Watch the video with slide synchronization on InfoQ.com! http://www.infoq.com/presentations /jigsaw-jdk-9
  3. 3. Purpose of QCon - to empower software development by facilitating the spread of knowledge and innovation Strategy - practitioner-driven conference designed for YOU: influencers of change and innovation in your teams - speakers and topics driving the evolution and innovation - connecting and catalyzing the influencers and innovators Highlights - attended by more than 12,000 delegates since 2007 - held in 9 cities worldwide Presented at QCon London www.qconlondon.com
  4. 4. © Copyright Azul Systems 2016 Agenda § API structure changes § Introduction to Jigsaw § Developing code with modules § Application migration § Resources 2
  5. 5. © Copyright Azul Systems 2016 API Structure Changes
  6. 6. © Copyright Azul Systems 2016 API Classification § Supported, intended for public use – JCP specified: java.*, javax.* – JDK specific: some com.sun.*, some jdk.* § Unsupported, not intended for public use – Mostly sun.* – Most infamous is sun.misc.Unsafe 4
  7. 7. © Copyright Azul Systems 2016 General Java Compatability Policy § If an application uses only supported APIs on version N of Java it should work on version N+1, even without recompilation § Supported APIs can be removed, but only with advanced notice § To date 23 classes, 18 interfaces and 379 methods have been deprecated – None have been removed 5
  8. 8. © Copyright Azul Systems 2016 JDK 9: Incompatible Changes § Encapsulate most JDK internal APIs § Remove a small number of supported APIs – 6 in total, all add/remove PropertyChangeListener – Already flagged in JSR 337 (Java SE 8), JEP 162 § Change the binary structure of the JRE and JDK § New version string format § A single underscore will no longer be allowed as an identifier in source code 6
  9. 9. © Copyright Azul Systems 2016 Removed In JDK 9 § Endorsed standard API override mechanism § Extension mechanism § No longer required now we have a module system 7
  10. 10. © Copyright Azul Systems 2016 Binary Structure Of JDK/JRE § Potentially disruptive change – Details in JEP 220 – Blurs the distinction between JRE and JDK § Implemented since late 2014 – Allow people to get used to new organisation 8
  11. 11. © Copyright Azul Systems 2016 JDK Structure bin Pre-JDK 9 JDK 9 lib tools.jar jre bin rt.jar lib libconfbin jre directory tools.jar rt.jar
  12. 12. © Copyright Azul Systems 2016 Most Popular Unsupported APIs 1.  sun.misc.BASE64Encoder 2.  sun.misc.Unsafe 3.  sun.misc.BASE64Decoder 10 Oracle dataset based on internal application code
  13. 13. © Copyright Azul Systems 2016 JDK Internal API Classification § Non-critical – Little or no use outside the JDK – Used only for convenience (alternatives exist) § Critical – Functionality that would be difficult, if not impossible to implement outside the JDK 11
  14. 14. © Copyright Azul Systems 2016 JEP 260 Proposal § Encapsulate all non-critical JDK-internal APIs § Encapsulate all critical JDK-internal APIs, for which supported replacements exist in JDK 8 § Do not encapsulate other critical JDK-internal APIs – Deprecate these in JDK 9 – Plan to encapsulate or remove them in JDK 10 – Provide command-line option to access encapsulated critical APIs 12
  15. 15. © Copyright Azul Systems 2016 JEP 260 Accessible Critical APIs § sun.misc.Unsafe § sun.misc.Signal § sun.misc.SignalHandler § sun.misc.Cleaner § sun.reflect.Reflection.getCallerClass § sun.reflect.ReflectionFactory 13
  16. 16. © Copyright Azul Systems 2016 Reviewing Your Own Code § jdeps tool – Introduced in JDK 8, improved in JDK 9 – Maven jdeps plugin jdeps –jdkinternals path/myapp.jar 14 path/myapp.jar -> /opt/jdk1.8.0/jre/lib/rt.jar <unnamed> (myapp.jar) -> java.awt -> java.awt.event -> java.beans -> java.io ...
  17. 17. © Copyright Azul Systems 2016 Introduction To Jigsaw And Modules
  18. 18. © Copyright Azul Systems 2016 Goals For Project Jigsaw §  Make Java SE more scalable and flexible §  Improve security, maintainability and performance §  Simplify construction, deployment and maintenance of large scale applications 16
  19. 19. © Copyright Azul Systems 2016 Modularity Specifications § Java Platform Module System – JSR 376: Targeted for JDK 9 (no promises) § Java SE 9: New JSR will cover modularisation of APIs § OpenJDK Project Jigsaw § Reference implementation for JSR 376 § JEP 200: The modular JDK § JEP 201: Modular source code § JEP 220: Modular run-time images § JEP 260: Encapsulate most internal APIs § JEP 261: Module system 17
  20. 20. © Copyright Azul Systems 2016 Module Fundamentals § Module is a grouping of code – For Java this is a collection of packages § The module can contain other things – Native code – Resources – Configuration data 18 com.azul.zoop com.azul.zoop.alpha.Name com.azul.zoop.alpha.Position com.azul.zoop.beta.Animal com.azul.zoop.beta.Zoo
  21. 21. © Copyright Azul Systems 2016 Module Declaration 19 module com.azul.zoop { } module-info.java com/azul/zoop/alpha/Name.java com/azul/zoop/alpha/Position.java com/azul/zoop/beta/Animal.java com/azul/zoop/beta/Zoo.java
  22. 22. © Copyright Azul Systems 2016 Module Dependencies module com.azul.zoop { requires com.azul.zeta; } com.azul.zoop com.azul.zeta
  23. 23. © Copyright Azul Systems 2016 Module Dependencies module com.azul.app { requires com.azul.zoop requires java.sql } com.azul.app com.azul.zoop java.sql
  24. 24. © Copyright Azul Systems 2016 Module Dependency Graph com.azul.app java.base java.sqlcom.azul.zoop com.azul.zeta java.xml java.logging
  25. 25. © Copyright Azul Systems 2016 Readability v. Dependency com.azul.app java.sql java.logging module java.sql { requires public java.logging; } Driver d = … Logger l = d.getParentLogger(); l.log(“azul’);
  26. 26. © Copyright Azul Systems 2016 Module Readability Graph com.azul.app java.base java.sqlcom.azul.zoop com.azul.zeta java.xml java.logging
  27. 27. © Copyright Azul Systems 2016 Package Visibility module com.azul.zoop { exports com.azul.zoop.alpha; exports com.azul.zoop.beta; } com.azul.zoop com.azul.zoop.alpha com.azul.zoop.beta com.azul.zoop.theta
  28. 28. © Copyright Azul Systems 2016 Accessibility § For a package to be visible – The package must be exported by the containing module – The containing module must be read by the using module § Public types from those packages can then be used com.azul.zoopcom.azul.app reads
  29. 29. © Copyright Azul Systems 2016 Java Accessibility (pre-JDK 9) public protected <package> private
  30. 30. © Copyright Azul Systems 2016 Java Accessibility (JDK 9) public to everyone public, but only to specific modules public only within a module protected <package> private public ≠ accessible (fundamental change to Java)
  31. 31. © Copyright Azul Systems 2016 JDK Platform Modules 29
  32. 32. © Copyright Azul Systems 2016 Developing Code With Modules
  33. 33. © Copyright Azul Systems 2016 Compilation 31 $ javac –d mods src/zeta/module-info.java src/zeta/com/azul/zeta/Vehicle.java mods/zeta/module-info.class mods/zeta/com/azul/zeta/Vehicle.class src/zeta/module-info.java src/zeta/com/azul/zeta/Vehicle.java
  34. 34. © Copyright Azul Systems 2016 Module Path $ javac –modulepath dir1:dir2:dir3
  35. 35. © Copyright Azul Systems 2016 Compilation With Module Path 33 $ javac –modulepath mods –d mods src/zoop/module-info.java src/zoop/com/azul/zoop/alpha/Name.java mods/zoop/module-info.class mods/zoop/com/azul/zoop/alpha/Name.class src/zoop/module-info.java src/zoop/com/azul/zoop/alpha/Name.java
  36. 36. © Copyright Azul Systems 2016 Application Execution § -modulepath can be abbreviated to -mp $ java –mp mods –m com.azul.app/com.azul.app.Main Azul application initialised! module name main class
  37. 37. © Copyright Azul Systems 2016 Module Diagnostics $ java –Xdiag:resolver –mp mods –m com.azul.zoop/com.azul.zoop.Main
  38. 38. © Copyright Azul Systems 2016 Packaging With Modular Jars mods/zoop/module-info.class mods/zoop/com/azul/app/Main.class $ jar --create --file myLib/app.jar --main-class com.azul.zoop.Main -C mods . module-info.class com/azul/zoop/Main.class app.jar
  39. 39. © Copyright Azul Systems 2016 Jar Files & Module Information $ jar --file myLib/app.jar –p Name: com.azul.zoop Requires: com.azul.zeta java.base [MANDATED] java.sql Main class: com.azul.zoop.Main
  40. 40. © Copyright Azul Systems 2016 Application Execution (JAR) $ java –mp myLib:mods –m com.azul.zoop.Main Azul application initialised!
  41. 41. © Copyright Azul Systems 2016 Linking Modular run-time image …confbin jlink $ jlink --modulepath $JDKMODS --addmods java.base –output myimage $ myimage/bin/java –listmods java.base@9.0
  42. 42. © Copyright Azul Systems 2016 Linking An Application $ jlink --modulepath $JDKMODS:$MYMODS --addmods com.azul.app –output myimage $ myimage/bin/java –listmods java.base@9.0 java.logging@9.0 java.sql@9.0 java.xml@9.0 com.azul.app@1.0 com.azul.zoop@1.0 com.azul.zeta@1.0 Version numbering for information purposes only
  43. 43. © Copyright Azul Systems 2016 Application Migration
  44. 44. © Copyright Azul Systems 2016 Typical Application (JDK 8) jar jar jar JDK jar jarjar jar jar jar jar jar jar
  45. 45. © Copyright Azul Systems 2016 Typical Application (JDK 9) jar jar jar module java.base module java.desktop module java.datatransfer module java.xml jar jarjar jar jar jar jar jar jar
  46. 46. © Copyright Azul Systems 2016 Sample Application myapp.jar lwjgl.jar mylib.jar gluegen-rt.jar jogl-all.jar module java.base module java.desktop module java.datatransfer module java.xml
  47. 47. © Copyright Azul Systems 2016 Run Application With Classpath $ java –classpath lib/myapp.jar: lib/mylib.jar: lib/liblwjgl.jar: lib/gluegen-rt.jar: lib/jogl-all.jar: myapp.Main
  48. 48. © Copyright Azul Systems 2016 Sample Application module myapp.jar lwjgl.jar module mylib.jar gluegen-rt.jar jogl-all.jar module java.base module java.desktop module java.datatransfer module java.xml
  49. 49. © Copyright Azul Systems 2016 Application module-info.java module myapp { requires mylib; requires java.base; requires java.sql; requires lwjgl; ???? requires gluegen-rt; ???? requires jogl-all; ???? }
  50. 50. © Copyright Azul Systems 2016 Sample Application module myapp.jar module lwjgl.jar module mylib.jar module gluegen-rt.jar module jogl-all.jar module java.base module java.desktop module java.datatransfer module java.xml
  51. 51. © Copyright Azul Systems 2016 Automatic Modules § Real modules § Reuse an existing JAR without change § Module name derived from JAR file name § Exports all its packages – No selectivity § Requires all modules accessible from the module path 49
  52. 52. © Copyright Azul Systems 2016 Sample Application module myapp.jar module lwjgl.jar module mylib.jar module gluegen-rt.jar module jogl-all.jar module java.base module java.desktop module java.datatransfer module java.xml
  53. 53. © Copyright Azul Systems 2016 Run Application With Modules $ java –classpath lib/myapp.jar: lib/mylib.jar: lib/liblwjgl.jar: lib/gluegen-rt.jar: lib/jogl-all.jar: myapp.Main $ java –mp mylib:lib –m myapp
  54. 54. © Copyright Azul Systems 2016 Summary & Further Information
  55. 55. © Copyright Azul Systems 2016 Summary § Modularisation is a big change for Java – JVM/JRE rather than language/APIs § Potentially disruptive changes to exposure of non-public APIs – Is it safe? § Developing modular code will require some learning – Not a huge change, though 53
  56. 56. © Copyright Azul Systems 2016 Zulu.org § Azul binary distribution of OpenJDK source code § Passed all TCK tests § Completely FREE! – Pay us if you’d like enterprise level support § Just announced: Embedded Zulu support for ARM 32-bit – Intel already supported – “Requires no licensing fee” 54
  57. 57. © Copyright Azul Systems 2016 Further Information § openjdk.java.net § openjdk.java.net/jeps § openjdk.java.net/projects/jigsaw § jcp.org 55
  58. 58. © Copyright Azul Systems 2016 © Copyright Azul Systems 2015 @speakjava azul.com Questions Simon Ritter Deputy CTO, Azul Systems 56
  59. 59. Watch the video with slide synchronization on InfoQ.com! http://www.infoq.com/presentations/ jigsaw-jdk-9

×