Java 9 and Project Jigsaw

Post on 16-Apr-2017

995 views 1 download

transcript

Java SE 9, Project Jigsaw

Elek Márton@anzix

2015 MarchDPC Consulting

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

Planned features

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

Modularization

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

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

module hu.dpc.java9.logger { }

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

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

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

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;}

Package level dependencies

Source: M Reinhold: The state of the module system

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

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

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

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."

JDK modules● Most of the APIs

are modularized● can’t be used

without proper requires in module-info

Service layer

Service Layerlogger-framework.jar

logger-mysql.jar

interface Logger{...}

class MysqlLogger{...}

class LoggerFactory{...

Service Layerlogger-framework.jar

logger-syslog.jar

interface Logger{...}

class SyslogLogger{...}

class LoggerFactory{...

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"); }}

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

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

logger-mysql.jar

interface Logger{...}

class MysqlLogger{...}

class LoggerFactory{...

Service Layer - Java 9Usage:

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

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;}

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/

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

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