From a3302aa4a69f1db5f3a843fa2bf48eb0ea6d84de Mon Sep 17 00:00:00 2001 From: Basil Crow Date: Wed, 30 Mar 2022 14:35:19 -0700 Subject: [PATCH] Dynamically configure Java compiler based on core --- .../maven/plugins/hpi/InitializeMojo.java | 75 +++++++++++++++++++ .../resources/META-INF/plexus/components.xml | 1 + 2 files changed, 76 insertions(+) create mode 100644 src/main/java/org/jenkinsci/maven/plugins/hpi/InitializeMojo.java diff --git a/src/main/java/org/jenkinsci/maven/plugins/hpi/InitializeMojo.java b/src/main/java/org/jenkinsci/maven/plugins/hpi/InitializeMojo.java new file mode 100644 index 0000000000..5769bbddcd --- /dev/null +++ b/src/main/java/org/jenkinsci/maven/plugins/hpi/InitializeMojo.java @@ -0,0 +1,75 @@ +package org.jenkinsci.maven.plugins.hpi; + +import hudson.util.VersionNumber; +import io.jenkins.lib.versionnumber.JavaSpecificationVersion; +import org.apache.maven.plugin.MojoExecutionException; +import org.apache.maven.plugins.annotations.LifecyclePhase; +import org.apache.maven.plugins.annotations.Mojo; + +/** + * Configure Maven for the desired version of Java. + * + * @author Basil Crow + */ +@Mojo(name = "initialize", defaultPhase = LifecyclePhase.INITIALIZE) +public class InitializeMojo extends AbstractJenkinsMojo { + + @Override + public void execute() throws MojoExecutionException { + setCompilerProperties(); + } + + private void setCompilerProperties() throws MojoExecutionException { + if (!project.getProperties().containsKey("maven.compiler.source") + && !project.getProperties().containsKey("maven.compiler.release")) { + // On an older plugin parent POM that predates the setting of these values as Maven properties. + return; + } + + JavaSpecificationVersion javaVersion = getMinimumJavaVersion(); + if (JavaSpecificationVersion.forCurrentJVM().isOlderThan(new VersionNumber("9"))) { + // Should always be set already, but just in case... + setProperty("maven.compiler.source", javaVersion.toString()); + setProperty("maven.compiler.target", javaVersion.toString()); + setProperty("maven.compiler.testSource", javaVersion.toString()); + setProperty("maven.compiler.testTarget", javaVersion.toString()); + // Should never be set already, but just in case... + unsetProperty("maven.compiler.release"); + unsetProperty("maven.compiler.testRelease"); + } else { + /* + * When compiling with a Java 9+ compiler, we always rely on "release" in favor of "source" and "target", + * even when compiling to Java 8 bytecode. + */ + setProperty("maven.compiler.release", Integer.toString(javaVersion.toReleaseVersion())); + setProperty("maven.compiler.testRelease", Integer.toString(javaVersion.toReleaseVersion())); + + // "release" serves the same purpose as Animal Sniffer. + setProperty("animal.sniffer.skip", "true"); + + /* + * While it does not hurt to have these set to the Java specification version, it is also not needed when + * "release" is in use. + */ + unsetProperty("maven.compiler.source"); + unsetProperty("maven.compiler.target"); + unsetProperty("maven.compiler.testSource"); + unsetProperty("maven.compiler.testTarget"); + } + } + + private void setProperty(String key, String value) { + String currentValue = project.getProperties().getProperty(key); + if (currentValue == null || !currentValue.equals(value)) { + getLog().info("Setting " + key + " to " + value); + project.getProperties().setProperty(key, value); + } + } + + private void unsetProperty(String key) { + if (project.getProperties().containsKey(key)) { + getLog().info("Unsetting " + key); + project.getProperties().remove(key); + } + } +} diff --git a/src/main/resources/META-INF/plexus/components.xml b/src/main/resources/META-INF/plexus/components.xml index 79237e44ee..2e6b7378c8 100644 --- a/src/main/resources/META-INF/plexus/components.xml +++ b/src/main/resources/META-INF/plexus/components.xml @@ -12,6 +12,7 @@ default org.jenkins-ci.tools:maven-hpi-plugin:validate,org.jenkins-ci.tools:maven-hpi-plugin:validate-hpi + org.jenkins-ci.tools:maven-hpi-plugin:initialize org.apache.maven.plugins:maven-resources-plugin:resources org.apache.maven.plugins:maven-compiler-plugin:compile org.kohsuke:access-modifier-checker:enforce