SlideShare a Scribd company logo
Java 9 and the impact on
Maven Projects
Robert Scholte (@rfscholte ) - chairman Apache Maven
“The success of Java 9 depends on the
adoption by IDEs and buildtools like
Maven”
 Jigsaw
 Since September 2015
 https://jdk9.java.net/jigsaw/
 ZIP
 Java9
 Since April 2014
 https://jdk9.java.net/download/
 Executable
3
Early Access releases
Challenge/Strategy Maven and Java9
• Support Maven 3.0 and above
• Only upgrades of plugins
 Set Java Runtime for Maven
 JAVA_HOME=/path/to/jdk-9
 Verify source/target of maven-compiler-plugin
 >= 6 (minimum jdk-9), okay
 < 6, must fork to preferred JDK
 Maven JRE <> maven-compiler-plugin JDK
5
Standard Java upgrade
Summary
Make most of the JDK's internal APIs inaccessible by
default but leave a few critical, widely-used internal
APIs accessible, until supported replacements exist for
all or most of their functionality.
6
JEP 260: Encapsulate Most Internal
APIs
• First java9-ea releases: close to no issues
• First jigsaw-ea release: ~99% of the Java Maven
projects failed to compile.
• Cause: JavacToolProvider + (System)Classloader
• Fixed and released within 72h!
• zero lines of code changed in Maven core codebase
to run on Java9
7
Results so far
• 220: Modular Run-Time Images *
• 223: New Version-String Scheme
• 226: UTF-8 Property Files
• 238: Multi-Release JAR Files
• 247: Compile for Older Platform Versions
• 261: Module System *
• 282: jlink: The Java Linker *
* Part of JSR 376: Java Platform Module System (Project jigsaw)
8
~10% of JEPs related to Maven
• 220: Modular Run-Time Images *
• 223: New Version-String Scheme
• 226: UTF-8 Property Files
• 238: Multi-Release JAR Files
• 247: Compile for Older Platform Versions
• 261: Module System *
• 282: jlink: The Java Linker *
* Part of JSR 376: Java Platform Module System (Project jigsaw)
9
Agenda
Summary
Revise the JDK's version-string scheme so that it is
easier to distinguish major, minor, and security-update
releases.
10
JEP 223: New Version-String Scheme
(project Verona)
11
Major (GA) Example
System property Existing Proposed
java.version 1.9.0 9
java.runtime.version 1.9.0-b100 9+100
java.vm.version 1.9.0-b100 9+100
java.specification.version 1.9 9
java.vm.specification.version 1.9 9
 Caused by: java.lang.ArrayIndexOutOfBoundsException: 1
 at org.codehaus.plexus.archiver.zip.AbstractZipArchiver….
• maven-archiver-3.0.1
 maven-jar-plugin-3.0.0
 maven-war-plugin-3.0.0
 maven-assembly-plugin-3.0.0
 maven-ear-plugin-xxx
• maven-javadoc-plugin-2.10.4
• …
12
version.split(“.”)[1]
Summary
Enhance javac so that it can compile Java programs to
run on selected older versions of the platform.
13
JEP 247: Compile for Older Platform
Versions
Leaking classes of the JDK
The official required javac arguments
 -source N
 -target N
 -bootclasspath <bootclasspath-from-N>
14
The problem
Java 9 and the impact on Maven Projects (ApacheCon Europe 2016)
• Always compile with the matching JDK version
• Configure maven-toolchain-plugin
• Configure toolchains.xml
 ${user.home}/.m2/toolchains.xml
 ${maven.home}/conf/toolchains.xml (since 3.3.1)
16
Available Maven Solutions (1)
• Verify code with jre signatures
• Configure animal-sniffer-maven-plugin
 Signature for N
 Execution-block with ‘check’ goal
17
Available Maven Solutions (2)
 “We defined a new command-line option, -release,
which automatically configures the compiler to
produce class files that will link against an
implementation of the given platform version. For the
platforms predefined in javac, -release N is
equivalent to -source N -target N -bootclasspath
<bootclasspath-from-N>.”
9-ea+135-jigsaw: --release (gnu-style)
18
Solution
• Configuration: <release>N</release>
• Property: maven.compiler.release
• If source/target AND release are specified,
release is used.
19
maven-compiler-plugin 3.6.0
Java 9 and the impact on Maven Projects (ApacheCon Europe 2016)
if ( javaVersion >= 1.8 ) {
// calculation based on Date-Time API (preferred)
}
else {
// calculation based on Date
}
source/target: 1.7
JDK: 1.8
JDK: 1.7 with reflection
21
Forward compatibility
Summary
Extend the JAR file format to allow multiple, Java-
release-specific versions of class files to coexist in a
single archive.
22
JEP 238: Multi-Release JAR Files
jar root
- A.class
- B.class
- C.class
- D.class
- META-INF
- versions
- 9
- A.class
- B.class
- 10
- A.class
23
JAR structure
project root
src/main/java
- A.java
- B.java
- C.java
- D.java
src/main/java9
- A.java
- B.java
src/main/java10
- A.java
 Will work with Maven execution-blocks, not with (all) IDEs
24
1 to 1 translation
multimodule root
multirelease-base/src/main/java
- A.java
- B.java
- C.java
- D.java
multirelease-nine/src/main/java
- A.java
- B.java
multirelease-ten/src/main/java
- A.java
multirelease/src/assembly/mvjar.xml
 https://github.com/hboutemy/maven-jep238
25
IDE friendly POC
Java 9 and the impact on Maven Projects (ApacheCon Europe 2016)
• Introduce new packaging (no install/deploy)
• Merge dependencies in JDK profiles
• Remove assembly descriptor
27
Improvements (in progress)
Summary
Restructure the JDK and JRE run-time images to
accommodate modules and to improve performance,
security, and maintainability. Define a new URI scheme
for naming the modules, classes, and resources stored
in a run-time image without revealing the internal
structure or format of the image. Revise existing
specifications as required to accommodate these
changes.
28
JEP 220: Modular Run-Time Images
 Most Apache maven-plugins already have a lot of
fallback scenarios for a long time.
 Projects that might suffer
 custom doclettags
 …
29
Removal of tools.jar
<profile>
<id>default-tools.jar</id>
<activation>
<jdk>(,9)</jdk> <!-- System.getProperty( “java.version” ) -->
</activation>
<dependencies>
<dependency>
<groupId>com.sun</groupId>
<artifactId>tools</artifactId>
<version>1.4.2</version>
<scope>system</scope>
<systemPath>${java.home}/../lib/tools.jar</systemPath>
</dependency>
</dependencies>
</profile>
30
Tools.jar profile
Summary
Implement the Java Platform Module System, as
specified by JSR 376, together with related JDK-specific
changes and enhancements.
31
JEP 261: Module System
 module-info.java
 Specify exposed packages
 Specify required modules (buildtime + runtime)
 Specify usage and implementation of SPIs
32
In a nutshell
module M.N {
requires A.B;
requires public C.D;
requires static E.F;
requires public static G.H;
exports P.Q;
exports R.S to T1.U1, T2.U2;
exports dynamic PP.QQ;
exports dynamic RR.SS to T1.U1, T2.U2;
uses V.W;
provides X.Y with Z1.Z2;
provides X.Y with Z3.Z4;
}
33
Module Declarations Example
(original proposal)
[|weak|open] module M.N {
requires A.B;
requires transitive C.D;
requires optional E.F;
requires transitive optional G.H;
exports P.Q;
exports R.S to T1.U1, T2.U2;
uses V.W;
provides X.Y with Z1.Z2;
provides X.Y with Z3.Z4;
}
34
Module Declarations Example
(current proposal)
• A hint for other projects using this as dependency (no
effect on this project)
• Maven best practice: don’t trust transitive dependencies;
specify dependency for every used class
• Concept adopted by Java9:
 Modules are unaware of dependency tree
 All (non-transitive) modules MUST be specified
35
Requires Modifier ‘transitive’
 comparable with dependency.optional
 Difference provided versus optional
 Buildtime: no difference
 Runtime:
 provided must be available (servlet-api)
 optional might be available (spring-boot deps)
36
Requires Modifier ‘optional’
37
Common usecases
• :compile, switch to modulepath when compiling
module-info.java
• :test-compile, switch to modulepath + classpath
when target/classes/module-info.class exists
38
maven-compiler-plugin 3.6.0
39
Building Maven with Maven
Java 9 and the impact on Maven Projects (ApacheCon Europe 2016)
• Documentation
• Central/Repository Managers?
Archiva/Artifactory/Nexus
• maven-dependency-plugin:list
41
Discover moduleName
Java 9 and the impact on Maven Projects (ApacheCon Europe 2016)
• The lower the supported Java version, the more
projects can use it
• The lower the supported Java version, the less Java
features can be used.
 Can we add module-info? Yes!
43
For library/framework/maven-
plugin/… builders
• module-info (-release 9)
• (other) java sources (source/target < 9)
• Maven Recipe
44
Backwards compatible libraries
• Classpath order:
 all direct dependencies
 all first level indirect dependencies
 all second level indirect dependencies
 …
• Locating a class:
 iterate over classpath (in same order); first match wins
45
Dependencies and classpath
• Modulepath: packages are mapped to a module
 Duplicate packages will result in an Exception
• Locating a class:
 find module based on package; get class from module
46
Dependencies and modulepath
 ‘requires’ means it is realy required!
 As enduser:
• No option to ignore requirements of third party
libraries
• No option to fix/choose package collisions between
transitive dependencies
47
GOTCHA: Dependency Excludes
 http://openjdk.java.net/projects/jigsaw/spec/issues/
48
Java Platform Module System:
Issue Summary
• Is it using internal classes?
 maven-jdeps-plugin-3.0.0
• Does it have duplicate
 extra-enforcer-rule > banDuplicateClasses
• Does it require certain Java9 features
 Upgrade the matching plugins
49
Is my project Java9-ready?
• Most features should work with Maven 3.0
• Some require Maven 3.3.1 due to improved
toolchains support
• Large number of new features already developed in
plugins, though not always released.
• New recipes “The Maven Way™”
50
The Apache Maven project tasklist
• Maven-compiler-plugin selecting modulePath or/and
classPath
• When Java9/Jigsaw fails:
 Usage internal APIs
 Duplicate (exported) packages
51
Developer awareness
Thank you
Give it a try!
Send feedback, issues & wishes

More Related Content

What's hot (20)

PDF
Migrating to Java 9 Modules
Sander Mak (@Sander_Mak)
 
PDF
Java 9 and Beyond
Mayank Patel
 
PDF
Polygot Java EE on the GraalVM
Ryan Cuprak
 
PDF
Preparing your code for Java 9
Deepu Xavier
 
PDF
Java modularity: life after Java 9
Sander Mak (@Sander_Mak)
 
ODP
Java 9 modularity
Knoldus Inc.
 
PDF
JDK-9: Modules and Java Linker
Bhanu Prakash Gopularam
 
PDF
OpenJDK-Zulu talk at JEEConf'14
Ivan Krylov
 
PPTX
Modularity of the Java Platform (OSGi, Jigsaw and Penrose)
Martin Toshev
 
PDF
Apache DeltaSpike the CDI toolbox
Antoine Sabot-Durand
 
PDF
Migrating to java 9 modules
Paul Bakker
 
PDF
Workflow automation for Front-end web applications
Mayank Patel
 
PDF
Java 9 and Project Jigsaw
DPC Consulting Ltd
 
PPTX
Java 9 Module System Introduction
Dan Stine
 
PPTX
Exploring Java Heap Dumps (Oracle Code One 2018)
Ryan Cuprak
 
PPTX
Apache maven 2 overview
Return on Intelligence
 
PPTX
Java modules using project jigsaw@jdk 9
Mauricio "Maltron" Leal
 
PDF
Modular JavaScript
Sander Mak (@Sander_Mak)
 
PPTX
Java EE 8 Update
Ryan Cuprak
 
PDF
Modular Java applications with OSGi on Apache Karaf
Ioan Eugen Stan
 
Migrating to Java 9 Modules
Sander Mak (@Sander_Mak)
 
Java 9 and Beyond
Mayank Patel
 
Polygot Java EE on the GraalVM
Ryan Cuprak
 
Preparing your code for Java 9
Deepu Xavier
 
Java modularity: life after Java 9
Sander Mak (@Sander_Mak)
 
Java 9 modularity
Knoldus Inc.
 
JDK-9: Modules and Java Linker
Bhanu Prakash Gopularam
 
OpenJDK-Zulu talk at JEEConf'14
Ivan Krylov
 
Modularity of the Java Platform (OSGi, Jigsaw and Penrose)
Martin Toshev
 
Apache DeltaSpike the CDI toolbox
Antoine Sabot-Durand
 
Migrating to java 9 modules
Paul Bakker
 
Workflow automation for Front-end web applications
Mayank Patel
 
Java 9 and Project Jigsaw
DPC Consulting Ltd
 
Java 9 Module System Introduction
Dan Stine
 
Exploring Java Heap Dumps (Oracle Code One 2018)
Ryan Cuprak
 
Apache maven 2 overview
Return on Intelligence
 
Java modules using project jigsaw@jdk 9
Mauricio "Maltron" Leal
 
Modular JavaScript
Sander Mak (@Sander_Mak)
 
Java EE 8 Update
Ryan Cuprak
 
Modular Java applications with OSGi on Apache Karaf
Ioan Eugen Stan
 

Viewers also liked (9)

PDF
Meetup IA Lyon - Introduction aux chatbots
cbouvard
 
PDF
Spark streaming state of the union
Databricks
 
PPTX
Java 9 Functionality and Tooling
Trisha Gee
 
ODP
Java: вчера, сегодня, завтра
Леонид Ставила
 
PDF
Java 9 – The Ultimate Feature List
Takipi
 
PDF
Real World Java 9 (QCon London)
Trisha Gee
 
PDF
What to expect from Java 9
Ivan Krylov
 
PDF
Four Things to Know About Reliable Spark Streaming with Typesafe and Databricks
Legacy Typesafe (now Lightbend)
 
PDF
Polar Expeditions and Agility: the 1910 Race to the South Pole and Modern Tales
OCTO Technology Suisse
 
Meetup IA Lyon - Introduction aux chatbots
cbouvard
 
Spark streaming state of the union
Databricks
 
Java 9 Functionality and Tooling
Trisha Gee
 
Java: вчера, сегодня, завтра
Леонид Ставила
 
Java 9 – The Ultimate Feature List
Takipi
 
Real World Java 9 (QCon London)
Trisha Gee
 
What to expect from Java 9
Ivan Krylov
 
Four Things to Know About Reliable Spark Streaming with Typesafe and Databricks
Legacy Typesafe (now Lightbend)
 
Polar Expeditions and Agility: the 1910 Race to the South Pole and Modern Tales
OCTO Technology Suisse
 
Ad

Similar to Java 9 and the impact on Maven Projects (ApacheCon Europe 2016) (20)

PPTX
Apache maven and its impact on java 9 (Java One 2017)
Robert Scholte
 
PPTX
Apache Maven supports ALL Java (Javaland 2019)
Robert Scholte
 
PPTX
Preparing for java 9 modules upload
Ryan Cuprak
 
PPTX
Apache Maven supports all Java (JokerConf 2018)
Robert Scholte
 
PPTX
(Re)-Introduction to Maven
Eric Wyles
 
PDF
Java in a world of containers
Docker, Inc.
 
PDF
Java in a World of Containers - DockerCon 2018
Arun Gupta
 
PPTX
Apache Maven for AT/QC
Volodymyr Ostapiv
 
PDF
Java 9 / Jigsaw - AJUG/VJUG session
Mani Sarkar
 
PDF
Webinar: Creating an Effective Docker Build Pipeline for Java Apps
Codefresh
 
PPTX
Maven Basics - Explained
Smita Prasad
 
PPTX
Maven in mulesoft
venkata20k
 
PPTX
Apache Maven basics
Volodymyr Ostapiv
 
PDF
Java, Eclipse, Maven & JSF tutorial
Raghavan Mohan
 
PDF
Intelligent Projects with Maven - DevFest Istanbul
Mert Çalışkan
 
PPTX
Introduction to Maven
Onkar Deshpande
 
PDF
Jdc 2010 - Maven, Intelligent Projects
Mert Çalışkan
 
PDF
Introduction to maven, its configuration, lifecycle and relationship to JS world
Dmitry Bakaleinik
 
PPT
An introduction to maven gradle and sbt
Fabio Fumarola
 
PPTX
The do's and don'ts with java 9 (Devoxx 2017)
Robert Scholte
 
Apache maven and its impact on java 9 (Java One 2017)
Robert Scholte
 
Apache Maven supports ALL Java (Javaland 2019)
Robert Scholte
 
Preparing for java 9 modules upload
Ryan Cuprak
 
Apache Maven supports all Java (JokerConf 2018)
Robert Scholte
 
(Re)-Introduction to Maven
Eric Wyles
 
Java in a world of containers
Docker, Inc.
 
Java in a World of Containers - DockerCon 2018
Arun Gupta
 
Apache Maven for AT/QC
Volodymyr Ostapiv
 
Java 9 / Jigsaw - AJUG/VJUG session
Mani Sarkar
 
Webinar: Creating an Effective Docker Build Pipeline for Java Apps
Codefresh
 
Maven Basics - Explained
Smita Prasad
 
Maven in mulesoft
venkata20k
 
Apache Maven basics
Volodymyr Ostapiv
 
Java, Eclipse, Maven & JSF tutorial
Raghavan Mohan
 
Intelligent Projects with Maven - DevFest Istanbul
Mert Çalışkan
 
Introduction to Maven
Onkar Deshpande
 
Jdc 2010 - Maven, Intelligent Projects
Mert Çalışkan
 
Introduction to maven, its configuration, lifecycle and relationship to JS world
Dmitry Bakaleinik
 
An introduction to maven gradle and sbt
Fabio Fumarola
 
The do's and don'ts with java 9 (Devoxx 2017)
Robert Scholte
 
Ad

Recently uploaded (20)

PPTX
COMPARISON OF RASTER ANALYSIS TOOLS OF QGIS AND ARCGIS
Sharanya Sarkar
 
PDF
Newgen 2022-Forrester Newgen TEI_13 05 2022-The-Total-Economic-Impact-Newgen-...
darshakparmar
 
PDF
CIFDAQ Market Insights for July 7th 2025
CIFDAQ
 
PDF
Reverse Engineering of Security Products: Developing an Advanced Microsoft De...
nwbxhhcyjv
 
PDF
HubSpot Main Hub: A Unified Growth Platform
Jaswinder Singh
 
PDF
From Code to Challenge: Crafting Skill-Based Games That Engage and Reward
aiyshauae
 
PDF
The Rise of AI and IoT in Mobile App Tech.pdf
IMG Global Infotech
 
PPTX
From Sci-Fi to Reality: Exploring AI Evolution
Svetlana Meissner
 
PDF
Building Real-Time Digital Twins with IBM Maximo & ArcGIS Indoors
Safe Software
 
PDF
Transcript: New from BookNet Canada for 2025: BNC BiblioShare - Tech Forum 2025
BookNet Canada
 
PDF
CIFDAQ Token Spotlight for 9th July 2025
CIFDAQ
 
PDF
Fl Studio 24.2.2 Build 4597 Crack for Windows Free Download 2025
faizk77g
 
PDF
What Makes Contify’s News API Stand Out: Key Features at a Glance
Contify
 
PPTX
OpenID AuthZEN - Analyst Briefing July 2025
David Brossard
 
PDF
Chris Elwell Woburn, MA - Passionate About IT Innovation
Chris Elwell Woburn, MA
 
PDF
HCIP-Data Center Facility Deployment V2.0 Training Material (Without Remarks ...
mcastillo49
 
PDF
Smart Trailers 2025 Update with History and Overview
Paul Menig
 
PPTX
"Autonomy of LLM Agents: Current State and Future Prospects", Oles` Petriv
Fwdays
 
PDF
How Startups Are Growing Faster with App Developers in Australia.pdf
India App Developer
 
PDF
Exolore The Essential AI Tools in 2025.pdf
Srinivasan M
 
COMPARISON OF RASTER ANALYSIS TOOLS OF QGIS AND ARCGIS
Sharanya Sarkar
 
Newgen 2022-Forrester Newgen TEI_13 05 2022-The-Total-Economic-Impact-Newgen-...
darshakparmar
 
CIFDAQ Market Insights for July 7th 2025
CIFDAQ
 
Reverse Engineering of Security Products: Developing an Advanced Microsoft De...
nwbxhhcyjv
 
HubSpot Main Hub: A Unified Growth Platform
Jaswinder Singh
 
From Code to Challenge: Crafting Skill-Based Games That Engage and Reward
aiyshauae
 
The Rise of AI and IoT in Mobile App Tech.pdf
IMG Global Infotech
 
From Sci-Fi to Reality: Exploring AI Evolution
Svetlana Meissner
 
Building Real-Time Digital Twins with IBM Maximo & ArcGIS Indoors
Safe Software
 
Transcript: New from BookNet Canada for 2025: BNC BiblioShare - Tech Forum 2025
BookNet Canada
 
CIFDAQ Token Spotlight for 9th July 2025
CIFDAQ
 
Fl Studio 24.2.2 Build 4597 Crack for Windows Free Download 2025
faizk77g
 
What Makes Contify’s News API Stand Out: Key Features at a Glance
Contify
 
OpenID AuthZEN - Analyst Briefing July 2025
David Brossard
 
Chris Elwell Woburn, MA - Passionate About IT Innovation
Chris Elwell Woburn, MA
 
HCIP-Data Center Facility Deployment V2.0 Training Material (Without Remarks ...
mcastillo49
 
Smart Trailers 2025 Update with History and Overview
Paul Menig
 
"Autonomy of LLM Agents: Current State and Future Prospects", Oles` Petriv
Fwdays
 
How Startups Are Growing Faster with App Developers in Australia.pdf
India App Developer
 
Exolore The Essential AI Tools in 2025.pdf
Srinivasan M
 

Java 9 and the impact on Maven Projects (ApacheCon Europe 2016)

  • 1. Java 9 and the impact on Maven Projects Robert Scholte (@rfscholte ) - chairman Apache Maven
  • 2. “The success of Java 9 depends on the adoption by IDEs and buildtools like Maven”
  • 3.  Jigsaw  Since September 2015  https://jdk9.java.net/jigsaw/  ZIP  Java9  Since April 2014  https://jdk9.java.net/download/  Executable 3 Early Access releases
  • 4. Challenge/Strategy Maven and Java9 • Support Maven 3.0 and above • Only upgrades of plugins
  • 5.  Set Java Runtime for Maven  JAVA_HOME=/path/to/jdk-9  Verify source/target of maven-compiler-plugin  >= 6 (minimum jdk-9), okay  < 6, must fork to preferred JDK  Maven JRE <> maven-compiler-plugin JDK 5 Standard Java upgrade
  • 6. Summary Make most of the JDK's internal APIs inaccessible by default but leave a few critical, widely-used internal APIs accessible, until supported replacements exist for all or most of their functionality. 6 JEP 260: Encapsulate Most Internal APIs
  • 7. • First java9-ea releases: close to no issues • First jigsaw-ea release: ~99% of the Java Maven projects failed to compile. • Cause: JavacToolProvider + (System)Classloader • Fixed and released within 72h! • zero lines of code changed in Maven core codebase to run on Java9 7 Results so far
  • 8. • 220: Modular Run-Time Images * • 223: New Version-String Scheme • 226: UTF-8 Property Files • 238: Multi-Release JAR Files • 247: Compile for Older Platform Versions • 261: Module System * • 282: jlink: The Java Linker * * Part of JSR 376: Java Platform Module System (Project jigsaw) 8 ~10% of JEPs related to Maven
  • 9. • 220: Modular Run-Time Images * • 223: New Version-String Scheme • 226: UTF-8 Property Files • 238: Multi-Release JAR Files • 247: Compile for Older Platform Versions • 261: Module System * • 282: jlink: The Java Linker * * Part of JSR 376: Java Platform Module System (Project jigsaw) 9 Agenda
  • 10. Summary Revise the JDK's version-string scheme so that it is easier to distinguish major, minor, and security-update releases. 10 JEP 223: New Version-String Scheme (project Verona)
  • 11. 11 Major (GA) Example System property Existing Proposed java.version 1.9.0 9 java.runtime.version 1.9.0-b100 9+100 java.vm.version 1.9.0-b100 9+100 java.specification.version 1.9 9 java.vm.specification.version 1.9 9
  • 12.  Caused by: java.lang.ArrayIndexOutOfBoundsException: 1  at org.codehaus.plexus.archiver.zip.AbstractZipArchiver…. • maven-archiver-3.0.1  maven-jar-plugin-3.0.0  maven-war-plugin-3.0.0  maven-assembly-plugin-3.0.0  maven-ear-plugin-xxx • maven-javadoc-plugin-2.10.4 • … 12 version.split(“.”)[1]
  • 13. Summary Enhance javac so that it can compile Java programs to run on selected older versions of the platform. 13 JEP 247: Compile for Older Platform Versions
  • 14. Leaking classes of the JDK The official required javac arguments  -source N  -target N  -bootclasspath <bootclasspath-from-N> 14 The problem
  • 16. • Always compile with the matching JDK version • Configure maven-toolchain-plugin • Configure toolchains.xml  ${user.home}/.m2/toolchains.xml  ${maven.home}/conf/toolchains.xml (since 3.3.1) 16 Available Maven Solutions (1)
  • 17. • Verify code with jre signatures • Configure animal-sniffer-maven-plugin  Signature for N  Execution-block with ‘check’ goal 17 Available Maven Solutions (2)
  • 18.  “We defined a new command-line option, -release, which automatically configures the compiler to produce class files that will link against an implementation of the given platform version. For the platforms predefined in javac, -release N is equivalent to -source N -target N -bootclasspath <bootclasspath-from-N>.” 9-ea+135-jigsaw: --release (gnu-style) 18 Solution
  • 19. • Configuration: <release>N</release> • Property: maven.compiler.release • If source/target AND release are specified, release is used. 19 maven-compiler-plugin 3.6.0
  • 21. if ( javaVersion >= 1.8 ) { // calculation based on Date-Time API (preferred) } else { // calculation based on Date } source/target: 1.7 JDK: 1.8 JDK: 1.7 with reflection 21 Forward compatibility
  • 22. Summary Extend the JAR file format to allow multiple, Java- release-specific versions of class files to coexist in a single archive. 22 JEP 238: Multi-Release JAR Files
  • 23. jar root - A.class - B.class - C.class - D.class - META-INF - versions - 9 - A.class - B.class - 10 - A.class 23 JAR structure
  • 24. project root src/main/java - A.java - B.java - C.java - D.java src/main/java9 - A.java - B.java src/main/java10 - A.java  Will work with Maven execution-blocks, not with (all) IDEs 24 1 to 1 translation
  • 25. multimodule root multirelease-base/src/main/java - A.java - B.java - C.java - D.java multirelease-nine/src/main/java - A.java - B.java multirelease-ten/src/main/java - A.java multirelease/src/assembly/mvjar.xml  https://github.com/hboutemy/maven-jep238 25 IDE friendly POC
  • 27. • Introduce new packaging (no install/deploy) • Merge dependencies in JDK profiles • Remove assembly descriptor 27 Improvements (in progress)
  • 28. Summary Restructure the JDK and JRE run-time images to accommodate modules and to improve performance, security, and maintainability. Define a new URI scheme for naming the modules, classes, and resources stored in a run-time image without revealing the internal structure or format of the image. Revise existing specifications as required to accommodate these changes. 28 JEP 220: Modular Run-Time Images
  • 29.  Most Apache maven-plugins already have a lot of fallback scenarios for a long time.  Projects that might suffer  custom doclettags  … 29 Removal of tools.jar
  • 30. <profile> <id>default-tools.jar</id> <activation> <jdk>(,9)</jdk> <!-- System.getProperty( “java.version” ) --> </activation> <dependencies> <dependency> <groupId>com.sun</groupId> <artifactId>tools</artifactId> <version>1.4.2</version> <scope>system</scope> <systemPath>${java.home}/../lib/tools.jar</systemPath> </dependency> </dependencies> </profile> 30 Tools.jar profile
  • 31. Summary Implement the Java Platform Module System, as specified by JSR 376, together with related JDK-specific changes and enhancements. 31 JEP 261: Module System
  • 32.  module-info.java  Specify exposed packages  Specify required modules (buildtime + runtime)  Specify usage and implementation of SPIs 32 In a nutshell
  • 33. module M.N { requires A.B; requires public C.D; requires static E.F; requires public static G.H; exports P.Q; exports R.S to T1.U1, T2.U2; exports dynamic PP.QQ; exports dynamic RR.SS to T1.U1, T2.U2; uses V.W; provides X.Y with Z1.Z2; provides X.Y with Z3.Z4; } 33 Module Declarations Example (original proposal)
  • 34. [|weak|open] module M.N { requires A.B; requires transitive C.D; requires optional E.F; requires transitive optional G.H; exports P.Q; exports R.S to T1.U1, T2.U2; uses V.W; provides X.Y with Z1.Z2; provides X.Y with Z3.Z4; } 34 Module Declarations Example (current proposal)
  • 35. • A hint for other projects using this as dependency (no effect on this project) • Maven best practice: don’t trust transitive dependencies; specify dependency for every used class • Concept adopted by Java9:  Modules are unaware of dependency tree  All (non-transitive) modules MUST be specified 35 Requires Modifier ‘transitive’
  • 36.  comparable with dependency.optional  Difference provided versus optional  Buildtime: no difference  Runtime:  provided must be available (servlet-api)  optional might be available (spring-boot deps) 36 Requires Modifier ‘optional’
  • 38. • :compile, switch to modulepath when compiling module-info.java • :test-compile, switch to modulepath + classpath when target/classes/module-info.class exists 38 maven-compiler-plugin 3.6.0
  • 41. • Documentation • Central/Repository Managers? Archiva/Artifactory/Nexus • maven-dependency-plugin:list 41 Discover moduleName
  • 43. • The lower the supported Java version, the more projects can use it • The lower the supported Java version, the less Java features can be used.  Can we add module-info? Yes! 43 For library/framework/maven- plugin/… builders
  • 44. • module-info (-release 9) • (other) java sources (source/target < 9) • Maven Recipe 44 Backwards compatible libraries
  • 45. • Classpath order:  all direct dependencies  all first level indirect dependencies  all second level indirect dependencies  … • Locating a class:  iterate over classpath (in same order); first match wins 45 Dependencies and classpath
  • 46. • Modulepath: packages are mapped to a module  Duplicate packages will result in an Exception • Locating a class:  find module based on package; get class from module 46 Dependencies and modulepath
  • 47.  ‘requires’ means it is realy required!  As enduser: • No option to ignore requirements of third party libraries • No option to fix/choose package collisions between transitive dependencies 47 GOTCHA: Dependency Excludes
  • 49. • Is it using internal classes?  maven-jdeps-plugin-3.0.0 • Does it have duplicate  extra-enforcer-rule > banDuplicateClasses • Does it require certain Java9 features  Upgrade the matching plugins 49 Is my project Java9-ready?
  • 50. • Most features should work with Maven 3.0 • Some require Maven 3.3.1 due to improved toolchains support • Large number of new features already developed in plugins, though not always released. • New recipes “The Maven Way™” 50 The Apache Maven project tasklist
  • 51. • Maven-compiler-plugin selecting modulePath or/and classPath • When Java9/Jigsaw fails:  Usage internal APIs  Duplicate (exported) packages 51 Developer awareness
  • 52. Thank you Give it a try! Send feedback, issues & wishes