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 JDK9

1,062 views

Published on

This is an update to my earlier presentation of the same title. A bit of new material and some polishing of the existing slides.

Published in: Software
  • Be the first to comment

Project Jigsaw in JDK9

  1. 1. © Copyright Azul Systems 2016 © Copyright Azul Systems 2015 @speakjava Project Jigsaw in JDK 9: Modularity Comes To Java Simon Ritter Deputy CTO, Azul Systems 1
  2. 2. © Copyright Azul Systems 2016 Agenda  API structure changes  Introduction to Jigsaw  Developing code with modules  Application migration  Resources 2
  3. 3. © Copyright Azul Systems 2016 API Structure Changes
  4. 4. © 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
  5. 5. © 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
  6. 6. © 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
  7. 7. © 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
  8. 8. © 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
  9. 9. © 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
  10. 10. © 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
  11. 11. © 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
  12. 12. © 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
  13. 13. © 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
  14. 14. © 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 ...
  15. 15. © Copyright Azul Systems 2016 Introduction To Jigsaw And Modules
  16. 16. © 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  Eliminate classpath hell 16
  17. 17. © 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
  18. 18. © 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
  19. 19. © 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
  20. 20. © Copyright Azul Systems 2016 Module Dependencies module com.azul.zoop { requires com.azul.zeta; } com.azul.zoop com.azul.zeta
  21. 21. © 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
  22. 22. © Copyright Azul Systems 2016 Module Dependency Graph com.azul.app java.base java.sqlcom.azul.zoop com.azul.zeta java.xml java.logging explicit implicit
  23. 23. © 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’);
  24. 24. © Copyright Azul Systems 2016 Module Implied Readability Graph com.azul.app java.base java.sqlcom.azul.zoop com.azul.zeta java.xml java.logging
  25. 25. © 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
  26. 26. © 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
  27. 27. © Copyright Azul Systems 2016 Java Accessibility (pre-JDK 9) public protected <package> private
  28. 28. © 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)
  29. 29. © Copyright Azul Systems 2016 JDK Platform Modules 29
  30. 30. © Copyright Azul Systems 2016 Developing Code With Modules
  31. 31. © 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
  32. 32. © Copyright Azul Systems 2016 Module Path $ javac –modulepath dir1:dir2:dir3
  33. 33. © 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
  34. 34. © 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
  35. 35. © Copyright Azul Systems 2016 Packaging With Modular JAR Files 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
  36. 36. © 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
  37. 37. © Copyright Azul Systems 2016 Application Execution (JAR) $ java –mp mylib:mods –m com.azul.zoop.Main Azul application initialised!
  38. 38. © 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
  39. 39. © 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
  40. 40. © Copyright Azul Systems 2016 Application Migration
  41. 41. © Copyright Azul Systems 2016 Typical Application (JDK 8) jar jar jar JDK jar jarjar jar jar jar jar jar jar Classpath
  42. 42. © 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 Unnamed module
  43. 43. © Copyright Azul Systems 2016 Sample Application myapp.ja r lwjgl.jar mylib.jar gluegen-rt.jar jogl-all.jar module java.base module java.desktop module java.datatransfer module java.xml
  44. 44. © 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
  45. 45. © Copyright Azul Systems 2016 Sample Application module myapp.ja r lwjgl.jar module mylib.jar gluegen-rt.jar jogl-all.jar module java.base module java.desktop module java.datatransfer module java.xml
  46. 46. © 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; ???? }
  47. 47. © Copyright Azul Systems 2016 Sample Application module myapp.ja r 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
  48. 48. © Copyright Azul Systems 2016 Automatic Modules  Real modules  Simply place unmodified jar file on module path – Rather than classpath  No changes to JAR file  Module name derived from JAR file name  Exports all its packages – No selectivity  Automatically requires all modules on the module path 48
  49. 49. © Copyright Azul Systems 2016 Application Module Dependencies module myapp.ja r 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 Implicit Explicit
  50. 50. © 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
  51. 51. © Copyright Azul Systems 2016 Summary & Further Information
  52. 52. © 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 52
  53. 53. © Copyright Azul Systems 2016 Further Information  openjdk.java.net  openjdk.java.net/jeps  openjdk.java.net/projects/jigsaw  jcp.org www.zulu.org 54
  54. 54. © Copyright Azul Systems 2016 © Copyright Azul Systems 2015 @speakjava Questions Simon Ritter Deputy CTO, Azul Systems 55

×