java 9 and project jigsaw
TRANSCRIPT
![Page 1: Java 9 and Project Jigsaw](https://reader031.vdocuments.site/reader031/viewer/2022030316/58725a2c1a28ab31498b4cc9/html5/thumbnails/1.jpg)
Java SE 9, Project Jigsaw
Elek Márton@anzix
2015 MarchDPC Consulting
![Page 2: Java 9 and Project Jigsaw](https://reader031.vdocuments.site/reader031/viewer/2022030316/58725a2c1a28ab31498b4cc9/html5/thumbnails/2.jpg)
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](https://reader031.vdocuments.site/reader031/viewer/2022030316/58725a2c1a28ab31498b4cc9/html5/thumbnails/3.jpg)
Planned features
![Page 4: Java 9 and Project Jigsaw](https://reader031.vdocuments.site/reader031/viewer/2022030316/58725a2c1a28ab31498b4cc9/html5/thumbnails/4.jpg)
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](https://reader031.vdocuments.site/reader031/viewer/2022030316/58725a2c1a28ab31498b4cc9/html5/thumbnails/5.jpg)
Modularization
![Page 6: Java 9 and Project Jigsaw](https://reader031.vdocuments.site/reader031/viewer/2022030316/58725a2c1a28ab31498b4cc9/html5/thumbnails/6.jpg)
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](https://reader031.vdocuments.site/reader031/viewer/2022030316/58725a2c1a28ab31498b4cc9/html5/thumbnails/7.jpg)
Getting startedCreate your first module:● traditional JAR file with● module-info.java
module hu.dpc.java9.logger { }
![Page 8: Java 9 and Project Jigsaw](https://reader031.vdocuments.site/reader031/viewer/2022030316/58725a2c1a28ab31498b4cc9/html5/thumbnails/8.jpg)
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](https://reader031.vdocuments.site/reader031/viewer/2022030316/58725a2c1a28ab31498b4cc9/html5/thumbnails/9.jpg)
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](https://reader031.vdocuments.site/reader031/viewer/2022030316/58725a2c1a28ab31498b4cc9/html5/thumbnails/10.jpg)
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](https://reader031.vdocuments.site/reader031/viewer/2022030316/58725a2c1a28ab31498b4cc9/html5/thumbnails/11.jpg)
Package level dependencies
Source: M Reinhold: The state of the module system
![Page 12: Java 9 and Project Jigsaw](https://reader031.vdocuments.site/reader031/viewer/2022030316/58725a2c1a28ab31498b4cc9/html5/thumbnails/12.jpg)
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](https://reader031.vdocuments.site/reader031/viewer/2022030316/58725a2c1a28ab31498b4cc9/html5/thumbnails/13.jpg)
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](https://reader031.vdocuments.site/reader031/viewer/2022030316/58725a2c1a28ab31498b4cc9/html5/thumbnails/14.jpg)
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](https://reader031.vdocuments.site/reader031/viewer/2022030316/58725a2c1a28ab31498b4cc9/html5/thumbnails/15.jpg)
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](https://reader031.vdocuments.site/reader031/viewer/2022030316/58725a2c1a28ab31498b4cc9/html5/thumbnails/16.jpg)
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](https://reader031.vdocuments.site/reader031/viewer/2022030316/58725a2c1a28ab31498b4cc9/html5/thumbnails/17.jpg)
Service layer
![Page 18: Java 9 and Project Jigsaw](https://reader031.vdocuments.site/reader031/viewer/2022030316/58725a2c1a28ab31498b4cc9/html5/thumbnails/18.jpg)
Service Layerlogger-framework.jar
logger-mysql.jar
interface Logger{...}
class MysqlLogger{...}
class LoggerFactory{...
![Page 19: Java 9 and Project Jigsaw](https://reader031.vdocuments.site/reader031/viewer/2022030316/58725a2c1a28ab31498b4cc9/html5/thumbnails/19.jpg)
Service Layerlogger-framework.jar
logger-syslog.jar
interface Logger{...}
class SyslogLogger{...}
class LoggerFactory{...
![Page 20: Java 9 and Project Jigsaw](https://reader031.vdocuments.site/reader031/viewer/2022030316/58725a2c1a28ab31498b4cc9/html5/thumbnails/20.jpg)
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](https://reader031.vdocuments.site/reader031/viewer/2022030316/58725a2c1a28ab31498b4cc9/html5/thumbnails/21.jpg)
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](https://reader031.vdocuments.site/reader031/viewer/2022030316/58725a2c1a28ab31498b4cc9/html5/thumbnails/22.jpg)
Service Layer - Java 6-8logger-framework.jar
logger-mysql.jar
interface Logger{...}
class MysqlLogger{...}
class LoggerFactory{...
![Page 23: Java 9 and Project Jigsaw](https://reader031.vdocuments.site/reader031/viewer/2022030316/58725a2c1a28ab31498b4cc9/html5/thumbnails/23.jpg)
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](https://reader031.vdocuments.site/reader031/viewer/2022030316/58725a2c1a28ab31498b4cc9/html5/thumbnails/24.jpg)
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](https://reader031.vdocuments.site/reader031/viewer/2022030316/58725a2c1a28ab31498b4cc9/html5/thumbnails/25.jpg)
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](https://reader031.vdocuments.site/reader031/viewer/2022030316/58725a2c1a28ab31498b4cc9/html5/thumbnails/26.jpg)
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](https://reader031.vdocuments.site/reader031/viewer/2022030316/58725a2c1a28ab31498b4cc9/html5/thumbnails/27.jpg)
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