Upload
dpc-consulting-ltd
View
998
Download
1
Embed Size (px)
Citation preview
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