41
Java 9 Modularity in Action @pbakker sdd @Sander_Mak

Java 9 Modularity in Action

Embed Size (px)

Citation preview

Page 1: Java 9 Modularity in Action

Java 9 Modularity in Action

@pbakker sdd @Sander_Mak

Page 2: Java 9 Modularity in Action

Today's journey

Modularity matters

Java 9 modules

Services

Migration

Linking

Page 3: Java 9 Modularity in Action

Modularity matters

Modularity is the ultimate agile tool

Page 4: Java 9 Modularity in Action

Good fences make good neighbours

Hide your internals!

Service contract

Module

Page 5: Java 9 Modularity in Action

Work in progress!

Java 9: Jigsaw, JSR-376

Page 6: Java 9 Modularity in Action

Goals‣ Modularise the JDK ‣ Reliable application composition ‣ Strong encapsulation - hide platform internals ‣ Improved security

Current status‣ JDK 9 modularised ‣ JSR 376 prototype (Jigsaw) ‣ No finalized spec yet

Page 7: Java 9 Modularity in Action

History of Jigsaw

JSR-277 Java Module System

2005 2006 2011 2014

JSR-294 Improved Modularity Support

Java 7: No Jigsaw

Java 8: No Jigsaw

JSR-376 Java Platform Module System

JSR-291 'OSGi 4.1'

Page 8: Java 9 Modularity in Action

JEP 200: The Modular JDK

Page 9: Java 9 Modularity in Action

Goodbye classpathReliable configuration

Page 10: Java 9 Modularity in Action

Goodbye classpathModules with explicit dependencies

my-modulerequires

other-module

Page 11: Java 9 Modularity in Action

Strong encapsulationHide your internals

java.base java.lang java.time java.util

com.sun.* sun.*

jdk.internal.*

my-modulerequires

Access checks at VM level (even reflection)

Page 12: Java 9 Modularity in Action

Why not just use OSGi?‣ OSGi is built on top of the JVM ‣ Can’t be used to modularise the JDK itself

Page 13: Java 9 Modularity in Action

Why not just use OSGi?‣ OSGi is built on top of the JVM ‣ Can’t be used to modularise the JDK itself

Why not only modularise the JDK?‣ Fair point :-) ‣ OSGi has never seen mass adoption, Java 9 will

bring modularity to all of us

Page 14: Java 9 Modularity in Action

Demo: EasyTextAnalyze text complexity

easytext.cli

easytext.analyis

requires

Page 15: Java 9 Modularity in Action

Contracts & Services

MyInterface i = new MyImpl();

How to use code that you can’t access?

Page 16: Java 9 Modularity in Action

Contracts & Services

Provider module

Service Registry

Consumer module

Register service

Lookup service

Return service

instance

Use an interface as contract

Page 17: Java 9 Modularity in Action

JSR-376 services module myApi { exports com.api; }

Page 18: Java 9 Modularity in Action

JSR-376 services module myApi { exports com.api; }

module myConsumer { requires myApi; uses com.api.MyService; }

Page 19: Java 9 Modularity in Action

JSR-376 services module myApi { exports com.api; }

‣ Services resolved and wired by modular runtime ‣ Use with 'enhanced' ServiceLoader API

module myConsumer { requires myApi; uses com.api.MyService; }

module myProvider { requires myApi; provides com.api.MyService with myProvider.MyServiceImpl; }

Page 20: Java 9 Modularity in Action

JSR-376 services module myApi { exports com.api; }

‣ Services resolved and wired by modular runtime ‣ Use with 'enhanced' ServiceLoader API

module myConsumer { requires myApi; uses com.api.MyService; }

module myProvider { requires myApi; provides com.api.MyService with myProvider.MyServiceImpl; }

Iterable<MyService> services = ServiceLoader.load(MyService.class);

for(MyService svc: services) { svc.doSomething(); }

Page 21: Java 9 Modularity in Action

ExtensibilityDemo: EasyText

Page 22: Java 9 Modularity in Action

Extensibility

Multiple algorithms: ‣ Flesch-Kincaid ‣ Coleman-Liau

Demo: EasyText

Page 23: Java 9 Modularity in Action

Extensibility

CLI & GUI?

Multiple algorithms: ‣ Flesch-Kincaid ‣ Coleman-Liau

Demo: EasyText

Page 24: Java 9 Modularity in Action

easytext.algorithm.api

easytext.algorithm.kincaid

easytext.algorithm.coleman

easytext.cli

easytext.gui

Demo: EasyText

javafx.controls

JDKApplication

javafx.graphics

Page 25: Java 9 Modularity in Action

easytext.algorithm.api

easytext.algorithm.kincaid

easytext.algorithm.coleman

easytext.cli

easytext.gui

Demo: EasyText

javafx.controls

JDKApplication

ServiceLoader

javafx.graphics

Page 26: Java 9 Modularity in Action

JSR-376 linking‣ Use a linking tool (jlink) to create a custom 'runtime

image' with only the modules you need ‣ Uses explicit dependencies from module-info.class ‣ Allows for whole-program optimization

Runtime image

jdk.base

jdk.desktop

my.mod1

my.mod2

JVM

Page 27: Java 9 Modularity in Action

Demo: EasyText linking

Page 28: Java 9 Modularity in Action

‣ Use jdeps to audit your code ‣ Escape hatch:

--add-exports java.base/javax.security.auth.x500=mymod

‣ Gradual migration possible ‣ Mix classpath & modulepath ‣ Automatic modules

Preparing for Java 9

Page 29: Java 9 Modularity in Action

Top down migrationcommons.lang3.3.4.jar demonstrator.jar

classpath

java.base module path

Page 30: Java 9 Modularity in Action

package com.javamodularity.demonstrator;

import org.apache.commons.lang3.StringUtils;

public class Demo {

public static void main(String args[]) { String output = StringUtils.leftPad("Leftpad FTW!", 20); System.out.println(output); } }

Classic classpath

Page 31: Java 9 Modularity in Action

package com.javamodularity.demonstrator;

import org.apache.commons.lang3.StringUtils;

public class Demo {

public static void main(String args[]) { String output = StringUtils.leftPad("Leftpad FTW!", 20); System.out.println(output); } }

Classic classpath

javac -cp lib/commons-lang3-3.4.jar -d out $(find src -name '*.java')

java -cp out:lib/commons-lang3-3.4.jar com.javamodularity.demonstrator.Demo

Compile

Run

Page 32: Java 9 Modularity in Action

Top down migrationcommons.lang3.3.4.jar demonstrator.jar

classpath

java.base module path

Page 33: Java 9 Modularity in Action

Top down migrationcommons.lang3.3.4.jar

demonstrator.jar

classpath

java.base module path

Can’t reference the classpath from named modules!

Page 34: Java 9 Modularity in Action

Top down migration

demonstrator.jar

classpath

java.base module path

commons.lang

But this isn’t our code!

Page 35: Java 9 Modularity in Action

Automatic Modules‣ A plain JAR on the module path becomes an

Automatic Module

‣ Module name derived from JAR name ‣ Exports everything ‣ Reads all other modules

Page 36: Java 9 Modularity in Action

module demonstrator { requires commons.lang; }

Using Automatic Modules

Page 37: Java 9 Modularity in Action

module demonstrator { requires commons.lang; }

Using Automatic Modules

javac --module-path lib --module-source-path src -d mods $(find src -name '*.java')

java --module-path mods:lib -m demonstrator/com.javamodularity.demonstrator.Demo

Compile

Run

Page 38: Java 9 Modularity in Action

‣ List of open issues http://openjdk.java.net/projects/jigsaw/spec/issues/

‣ Optional dependencies ‣ Resource Encapsulation ‣ 'Open' Reflection ‣ Module versioning

Open issues

Page 39: Java 9 Modularity in Action

‣ JSR-376 forces module-aware tooling ‣ Modularity throughout all

development phases

Java 9's promise

Page 40: Java 9 Modularity in Action

‣ JSR-376 forces module-aware tooling ‣ Modularity throughout all

development phases

Java 9's promise

Spotlight on modularity == good

Page 41: Java 9 Modularity in Action

Thank you.

see: bit.ly/java9book

Follow @javamodularity