Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
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

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