Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Maven standardized support for multi-releases jars

Tags:

maven

java-9

Java 9 released with JEP-238, which basically allows us to ship multiple versions of runtime classes. The question is how this JEP is supported by maven?

  • I mean how and where to configure multiple versions in maven? I know I can run an ant task, but can I do it with say maven-compiler plugin or another standardized way?
  • And where and how should I place the different versions of java classes? JEP is constraining the compiled class files and say us where we should place it in jar but what about development?
like image 499
Izbassar Tolegen Avatar asked Oct 04 '17 05:10

Izbassar Tolegen


1 Answers

I mean how and where to configure multiple versions in maven? I know I can run an ant task, but can I do it with say maven-compiler plugin or another standardized way?

I believe the maven-compiler-plugin is not the appropriate place to take care of the release or even if we say ant tasks. Its supposed to be compiling the sources of a project seeking the need of which it has though introduced a flag

-release N

whose usage seems similar to that of the -source N and -target N.

It shall compile for a specific VM version(N) and shall support targets: 6, 7, 8, 9. It is similar to the new flag introduced in javac as

--release <release>

The java way of creating a multi-release jar, placing some files in the META-INF/versions/9 directory after this shall be of the format :

jar --create --file mr.jar -C foo classes --release 9 -C foo9 classes

In terms of MR-JAR maven implementation, one of the alternates currently could be as linked by @simas or listed below as proposals(couldn't get to find their released implementations) in one of the analysis.

Note: Shouldn't one rather be interested in moving to JMODs instead of considering MR-JAR for versions 9 and later?

And where and how should I place the different versions of java classes?

In the document Java 9 and its Impact on Maven Projects, the proposals to solve for the MR-JAR has been to either keep a 1 to 1 translation to the structure as mentioned in the JEP-238

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

which though can work with different executions in maven but could possibly be inconvenient to be exposed to IDEs.

Another alternate with a sample hboutemy/maven-jep238 has been listed with the same to make use of following structure:-

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

October 4, 2017

I couldn't find an official documentation or implementation where these proposals are consumed by an open source/organisation, hence inferring its not very plainly possible using Maven currently.

like image 168
Naman Avatar answered Nov 03 '22 00:11

Naman