27
Java SE 9, Project Jigsaw Elek Márton @anzix 2015 March DPC Consulting

Java 9 and Project Jigsaw

Embed Size (px)

Citation preview

Page 1: Java 9 and Project Jigsaw

Java SE 9, Project Jigsaw

Elek Márton@anzix

2015 MarchDPC Consulting

Page 2: Java 9 and Project Jigsaw

Java 9 roadmap2015/09/08 Mark Reinhold: The state of the module system (Java 9 b83)2015/12/10 Feature Complete2016/02/04 All Tests Run2016/02/25 Rampdown Start2016/04/21 Zero Bug Bounce2016/06/16 Rampdown Phase 22016/07/21 Final Release Candidate2016/09/22 General Availability

Page 3: Java 9 and Project Jigsaw

Planned features

Page 4: Java 9 and Project Jigsaw

Improvements● Java REPL● HTTP2 Client● UTF-8 Property files● Microbenchmark Suite● Compiler improvements● Money and Currency API, JSR-354 (?)● JSON API (? - proposed to be dropped)● ProcessAPI update (pid, process list)● HTML5 Javadoc● Make G1 the default GC algorithm● Remove deprecated GC combinations

Page 5: Java 9 and Project Jigsaw

Modularization

Page 6: Java 9 and Project Jigsaw

Related JEPs/JSR

JEP 200: The Modular JDKJEP 201: Modular Source CodeJEP 220: Modular Run-Time ImagesJEP 162: Prepare for Modularization (Java8)JSR 376: Java Platform Module System

Good source:Mark Reinhold: The state of the module system

Page 7: Java 9 and Project Jigsaw

Getting startedCreate your first module:● traditional JAR file with● module-info.java

module hu.dpc.java9.logger { }

Page 8: Java 9 and Project Jigsaw

Compile the module● Could be compiled with standard tools (maven) if

there are no dependencies● Command line tools are also changed

javac -d /tmp/modules/hu.dpc.java9.logger -modulepath /tmp/modules -sourcepath src/main/java …..java

Page 9: Java 9 and Project Jigsaw

Using the loggerCreate your first module:● traditional JAR file with● module-info.java

module hu.dpc.java9.logger { exports hu.dpc.java9.logger;}

Page 10: Java 9 and Project Jigsaw

Using logger

public class App { public static void main(String[] args) LoggerFactory.getLogger().log("Hello world"); }}

module hu.dpc.java9.app { requires hu.dpc.java9.logger;}

Page 11: Java 9 and Project Jigsaw

Package level dependencies

Source: M Reinhold: The state of the module system

Page 12: Java 9 and Project Jigsaw

Why we need classloaders?● Classloader is for creating new classes● Reference to a class could be used even without

explicit export

LoggerImpl

AppLoggerFactoryLogger exports

requires

Page 13: Java 9 and Project Jigsaw

Compile and runjavac -d /tmp/modules/hu.dpc.java9.logger -modulepath /tmp/modules -sourcepath src/main/java ....java

java -mp /tmp/modules -m hu.dpc.java9.app/hu.dpc.java9.App

Page 14: Java 9 and Project Jigsaw

Backward compatibilityjava -mp /tmp/modules -m hu.dpc.java9.app/hu.dpc.java9.App

java -cp /tmp/modules/hu.dpc.java9.app:/tmp/modules/hu.dpc.java9.logger

hu.dpc.java9.App

Page 15: Java 9 and Project Jigsaw

Packaging: jmod ● Accommodate native code, configuration files, and

other kinds of data● "Whether this new format, provisionally named

“JMOD,” should be standardized is an open question."

Page 16: Java 9 and Project Jigsaw

JDK modules● Most of the APIs

are modularized● can’t be used

without proper requires in module-info

Page 17: Java 9 and Project Jigsaw

Service layer

Page 18: Java 9 and Project Jigsaw

Service Layerlogger-framework.jar

logger-mysql.jar

interface Logger{...}

class MysqlLogger{...}

class LoggerFactory{...

Page 19: Java 9 and Project Jigsaw

Service Layerlogger-framework.jar

logger-syslog.jar

interface Logger{...}

class SyslogLogger{...}

class LoggerFactory{...

Page 20: Java 9 and Project Jigsaw

Service Layer - Java 6-8Service Provider Interface● Which are the implementation of a specific

interface?

ServiceLoader<Logger> loggers = ServiceLoader.load(Logger.class); for (Logger logger: loggers) { logger.log("hello world"); }}

Page 21: Java 9 and Project Jigsaw

Service Layer - Java 6-8ServiceLoader<Logger> loggers = ServiceLoader.load(Logger.class); for (Logger logger: loggers) { logger.log("hello world"); }}

Definition (in the jar file):META-INF/services/hu.dpc.java9.logger.Loggerhu.dpc.java9.logger.internal.LoggerImpl

Page 22: Java 9 and Project Jigsaw

Service Layer - Java 6-8logger-framework.jar

logger-mysql.jar

interface Logger{...}

class MysqlLogger{...}

class LoggerFactory{...

Page 23: Java 9 and Project Jigsaw

Service Layer - Java 9Usage:

ServiceLoader<Logger> loggers = ServiceLoader.load(Logger.class); for (Logger logger: loggers) { logger.log("hello world"); }}

Page 24: Java 9 and Project Jigsaw

DefinitionIn the hu.dpc.java9.logger module:module hu.dpc.java9.logger { exports hu.dpc.java9.logger; provides hu.dpc.java9.logger.Logger with hu.dpc.java9.logger.internal.LoggerImpl;}

In the hu.dpc.java9.app modulemodule hu.dpc.java9.app { requires hu.dpc.java9.logger; use hu.dpc.java9.logger.Logger;}

Page 25: Java 9 and Project Jigsaw

Non requirements● Modularize the Java Language Specification● Modularize the Java Virtual Machine Specification ● Multiple versions● Version selection● Strict classloader requirements

See: http://openjdk.java.net/projects/jigsaw/spec/reqs/

Page 26: Java 9 and Project Jigsaw

Java 9 vs OSGiJava 9 / Jigsaw OSGi

metadata module-info.java (nincs meta adat) META-INF

classpath separation

exports/requires Import-Package/Export-Package

classpath++ transitive imports, fragment bundle/dynamic import

classloader hierarchy

ClassLoader: unspecified strict, per bundle

service layer static (get implementations) dynamic (get implemetations + start/stop listeners)

services interface + implementation for the standard services (logging, config...)

versioning no yes

Page 27: Java 9 and Project Jigsaw

Summary/Future● Summary

– classpath separation: private/public– service locator (based on existing SPI)– modularized JVM APIs

● Not scope– versioning!– strict class loader rules

● Shoud be upgraded:– all the IDEs – all the build tools (maven, gradle)– all the JVM based languages (Scala, Clojure)

● SPI– could be more widely adopted