Project Jigsaw in JDK 9: Modularity Comes To Java · Project Jigsaw in JDK 9: Modularity Comes To...

Post on 22-May-2020

23 views 0 download

Transcript of Project Jigsaw in JDK 9: Modularity Comes To Java · Project Jigsaw in JDK 9: Modularity Comes To...

© 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

© Copyright Azul Systems 2016

Agenda § API structure changes §  Introduction to Jigsaw § Developing code with modules § Application migration § Advanced stuff § Summary & Further Information

2

© Copyright Azul Systems 2016

API Structure Changes

© 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

© 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

© 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

© 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

© 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

8

© 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

9

© 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

10

© Copyright Azul Systems 2016

Reviewing Your Own Code §  jdeps tool

– Introduced in JDK 8, improved in JDK 9 – Maven jdeps plugin

jdeps–jdkinternalspath/myapp.jar

11

path/myapp.jar->/opt/jdk1.8.0/jre/lib/rt.jar<unnamed>(myapp.jar)->java.awt->java.awt.event->java.beans->java.io...

© Copyright Azul Systems 2016

Introduction To Jigsaw And Modules

© Copyright Azul Systems 2016

Goals For Project Jigsaw §  Make Java SE more scalable and flexible

–  IoT devices need more compact Java runtimes §  Improve security, maintainability and performance

§  Simplify construction, deployment and maintenance of large scale applications

§  Eliminate classpath hell

13

© 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

14

com.azul.zoop

com.azul.zoop.alpha.Name com.azul.zoop.alpha.Position com.azul.zoop.beta.Animal com.azul.zoop.beta.Zoo

© Copyright Azul Systems 2016

Module Declaration

15

modulecom.azul.zoop{}

module-info.javacom/azul/zoop/alpha/Name.javacom/azul/zoop/alpha/Position.javacom/azul/zoop/beta/Animal.javacom/azul/zoop/beta/Zoo.java

© Copyright Azul Systems 2016

Module Dependencies

modulecom.azul.zoop{requirescom.azul.zeta;} com.azul.zoop

com.azul.zeta

© Copyright Azul Systems 2016

Module Dependencies

modulecom.azul.app{requirescom.azul.zooprequiresjava.sql}

com.azul.app

com.azul.zoop java.sql

© Copyright Azul Systems 2016

Module Dependency Graph com.azul.app

java.base

java.sql com.azul.zoop

com.azul.zeta java.xml java.logging

explicit implicit

© Copyright Azul Systems 2016

Readability v. Dependency

com.azul.app

java.sql

java.logging

modulejava.sql{requirespublicjava.logging;}

Driverd=…Loggerl=d.getParentLogger();l.log(“azul’);

Implied readability

© Copyright Azul Systems 2016

Module Implied Readability Graph com.azul.app

java.base

java.sql com.azul.zoop

com.azul.zeta java.xml java.logging

explicit implicit implied

© Copyright Azul Systems 2016

Package Visibility

modulecom.azul.zoop{requirescom.azul.zeta;exportscom.azul.zoop.alpha;exportscom.azul.zoop.beta;}

com.azul.zoop

com.azul.zoop.alphacom.azul.zoop.beta com.azul.zoop.theta

© 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.zoop com.azul.app

reads

© Copyright Azul Systems 2016

Java Accessibility (pre-JDK 9)

publicprotected<package>private

© Copyright Azul Systems 2016

Java Accessibility (JDK 9)

publictoeveryonepublic,butonlytospecificmodulespubliconlywithinamoduleprotected<package>private

public ≠ accessible (fundamental change to Java)

© Copyright Azul Systems 2016

JDK 8 Dependencies

© Copyright Azul Systems 2016

JDK 9 Platform Modules

26

java.se

java.compact3

java.compact2

java.compact1

java.scripting

java.instrument

java.base

java.logging

java.sql

java.sql.rowset

java.xml

java.desktop

java.rmi

java.prefs java.datatransfer

java.compiler

java.management java.security.jgss

java.naming

java.security.sasl

All modules depend on java.base

© Copyright Azul Systems 2016

JDK 9 Platform Modules

27

java.se.ee java.se

java.xml.bind

java.corba

java.compiler

java.desktop

java.annotations.common

java.rmi

java.datatransfer

java.management

java.xml.ws

java.naming

java.transaction

java.activation

All modules depend on java.base

© Copyright Azul Systems 2016

Developing Code With Modules

© Copyright Azul Systems 2016

Compilation

29

$javac–dmods\src/zeta/module-info.java\src/zeta/com/azul/zeta/Vehicle.java

mods/zeta/module-info.classmods/zeta/com/azul/zeta/Vehicle.class

src/zeta/module-info.javasrc/zeta/com/azul/zeta/Vehicle.java

© Copyright Azul Systems 2016

Module Path

$javac–modulepathdir1:dir2:dir3

© Copyright Azul Systems 2016

Compilation With Module Path

31

$javac–modulepathmods–dmods\src/zoop/module-info.java\src/zoop/com/azul/zoop/alpha/Name.java

mods/zoop/module-info.classmods/zoop/com/azul/zoop/alpha/Name.class

src/zoop/module-info.javasrc/zoop/com/azul/zoop/alpha/Name.java

© Copyright Azul Systems 2016

Application Execution

§ -modulepath can be abbreviated to -mp

$java–mpmods–mcom.azul.app/com.azul.app.MainAzulapplicationinitialised!

module name main class

© Copyright Azul Systems 2016

Packaging With Modular JAR Files mods/zoop/module-info.classmods/zoop/com/azul/app/Main.class

$jar--create--filemylib/app.jar\--main-classcom.azul.app.Main\-Cmods.

module-info.classcom/azul/app/Main.class

app.jar

© Copyright Azul Systems 2016

JAR Files & Module Information

$jar--filemylib/app.jar–pName:com.azul.zoopRequires:com.azul.zetajava.base[MANDATED]java.sqlMainclass:com.azul.zoop.Main

© Copyright Azul Systems 2016

Application Execution (JAR)

$java–mpmylib:mods–mcom.azul.appAzulapplicationinitialised!

© Copyright Azul Systems 2016

Linking Modular run-time

image

… conf bin

jlink

$jlink--modulepath$JDKMODS\--addmodsjava.base–outputmyimage$myimage/bin/java–listmodsjava.base@9.0

© Copyright Azul Systems 2016

Linking An Application

$jlink--modulepath$JDKMODS:$MYMODS\--addmodscom.azul.app–outputmyimage$myimage/bin/java–listmodsjava.base@9.0java.logging@9.0java.sql@9.0java.xml@9.0com.azul.app@1.0com.azul.zoop@1.0com.azul.zeta@1.0

Version numbering for information purposes only “It is not a goal of the module system to solve the version-

selection problem”

© Copyright Azul Systems 2016

Application Migration

© Copyright Azul Systems 2016

Typical Application (JDK 8)

jar jar

jar

JDK

jar

jar jar jar jar

jar jar

jar

jar

Cla

sspa

th

© Copyright Azul Systems 2016

Typical Application (JDK 9)

jar jar

jar

module java.base

module java.desktop

module java.datatransfer

module java.xml

jar

jar jar jar jar

jar jar

jar

jar

Unnamed module

© 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

© 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

© 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

© Copyright Azul Systems 2016

Application module-info.java

modulemyapp{requiresmylib;requiresjava.base;requiresjava.sql;requireslwjgl;????requiresgluegen-rt;????requiresjogl-all;????}

© 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

© 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

46

© Copyright Azul Systems 2016

Application Module Dependencies 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

Implicit Explicit

© 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–mpmylib:lib–mmyapp

© Copyright Azul Systems 2016

Advanced Stuff

© Copyright Azul Systems 2016

Modular Jar Files And JMODs § Modular jar files are simple

– Standard jar file possibly with module-info.class file – Can use existing (unmodified) jar files

§ JMOD files – More complex module files – Used for modules in the JDK – Can include native files (JNI), configuration files and other

data – Based on zip file format (pending final details - JEP 261)

50

© Copyright Azul Systems 2016

jmod Command

§ Create can specify several details: – Main class – Native libraries and commands – Configuration data – OS name, version and machine architecture

§ Details included in module-info.class file

51

jmod(create|list|describe)<options><jmod-file>

© Copyright Azul Systems 2016

Classloaders (Since JDK 1.2)

52

Bootstrap classloader (Internal Class) Bootstrap Class Path

Extension classloader (URLClassLoader) Extension Mechanism

Application classloader (URLClassLoader) Class Path

© Copyright Azul Systems 2016

Classloaders (JDK 9)

53

Bootstrap classloader (Internal Class) bootstrap class path

Platform classloader (Internal Class) JDK classes with specific permissions

Application classloader (Internal Class) Class & Module Path

© Copyright Azul Systems 2016

Summary & Further Information

© Copyright Azul Systems 2016

Tooling Support § NetBeans leads the way § Early Access NetBeans 9 available § Support for module-info.java file

– Graphing of dependencies

55

© Copyright Azul Systems 2016

NetBeans Tooling

56

© 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

57

© Copyright Azul Systems 2016

Further Information § openjdk.java.net § openjdk.java.net/jeps § openjdk.java.net/projects/jigsaw §  jcp.org

§ www.zulu.org

58

© Copyright Azul Systems 2016

© Copyright Azul Systems 2015

@speakjava azul.com

Questions

Simon Ritter Deputy CTO, Azul Systems

59