0

We are working to upgrade our API from Java 8 to Java 11.

However we need to support Java 8 and Java 11 both at same time because all clients are not ready to move on Java 11.

Is it possible if we can create maven build with Java 8 and Java 11 without duplicate our repository and without any change in pom.xml each time before create build for Java 8 and Java 11?

Generated artifact should have different name to distinguish Java 8 and Java 11 versions something like xyz-jdk8-0.0.1.jar and xyz-jdk11-.0.1.jar

Sushil
  • 285
  • 3
  • 16
  • Check this: https://stackoverflow.com/questions/19654557/how-to-set-specific-java-version-to-maven#:~:text=Maven%20uses%20the%20JAVA_HOME%20parameter,(non%2Dwindows)%2F%20mvn. – User9123 Apr 19 '22 at 16:08
  • 1
    Java is backwardly compatible: Jars built using older versions will run in newer JREs. 1) Build in Java 8. 2) Upgrade all runtime envs. 3) Upgrade build server. 4) Upgrade developer env. – Bohemian Apr 19 '22 at 16:08
  • Build with JDK11 and use `--release 8` that will work... using `8` and make maven-enforcer rule to require at minimum to build with JDK11.... – khmarbaise Apr 19 '22 at 16:17
  • I think it should work for me - https://stackoverflow.com/questions/10920142/how-to-configure-maven-to-build-two-versions-of-an-artifact-each-one-for-a-diff – Sushil Apr 20 '22 at 00:07

2 Answers2

0

You should:

  • Remove from you POM, if present, maven.compiler.source and maven.compiler.target.
  • Set JAVA_HOME=<<JAVA_8_HOME_FOLDER>>.
  • Build from Java 8 by mvn clean install.
  • Take the Java 8 artifact.
  • Set JAVA_HOME=<<JAVA_11_HOME_FOLDER>>.
  • Build from Java 11 by mvn clean install.
  • Take the Java 11 artifact.
Antonio Petricca
  • 6,313
  • 5
  • 28
  • 63
0

TL;DR

You don't need that, just build to Java 8 and be happy!


Solving

You can use Maven Build Profiles for this: https://maven.apache.org/guides/introduction/introduction-to-profiles.html

1. Set your properties to Java 11:

<properties>
  <maven.compiler.target>11</maven.compiler.target>
  <maven.compiler.source>11</maven.compiler.source>
  <maven.compiler.release>11</maven.compiler.release>
</properties>

2. Set your final name:

<build>
  <finalName>${project.artifactId}-jdk11-${project.version}</finalName>
</build>

3. Add a profile:

<profile>
  <id>jdk-8</id>
  <properties>
    <maven.compiler.target>1.8</maven.compiler.target>
    <maven.compiler.release>1.8</maven.compiler.release>
  </properties>
  <build>
    <finalName>${project.artifactId}-jdk8-${project.version}</finalName>
  </build>
</profile>

4. Build:

You will need to run 2 builds, one normal, and other activating the JDK 8 profile:

$ mvn ...
$ mvn ... -P jdk-8

Considerations:

  • Always use JDK 11 as it can confidently build Java 8 targets;
  • You don't need target and source properties, but if some plugin fails, put it back.
Claudio Weiler
  • 402
  • 2
  • 12
  • Thanks. One more point I missed to add that api jar should have diffderent name for Java 8 and Java 11 otherwise it will create confusion for users. I think xyz-jdk8-version.jar and xyz-jdk11.version.jar. Let me see if we can do it using profile. – Sushil Apr 19 '22 at 23:48
  • Yes, you can, just mess with finalName: https://maven.apache.org/pom.html. Edited my answer. – Claudio Weiler Apr 20 '22 at 15:08