Java 9 and the impact on Maven Projects (ApacheCon Europe 2016)
•Download as PPSX, PDF•
5 likes•1,736 views
The document discusses the impact of Java 9 on Maven projects and provides strategies for Maven and plugins to support Java 9. It outlines changes in Java 9 like the module system and new JAR format that Maven must accommodate. It recommends verifying that plugins work with Java 9 and do not use internal APIs or have duplicate packages. Maven plugins may need to select the module path for compilation in some cases.
1 of 52
More Related Content
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
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
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
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
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)
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’
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
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