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..6f1d542992 --- /dev/null +++ b/src/main/java/org/jenkinsci/maven/plugins/hpi/InitializeMojo.java @@ -0,0 +1,91 @@ +package org.jenkinsci.maven.plugins.hpi; + +import edu.umd.cs.findbugs.annotations.CheckForNull; +import edu.umd.cs.findbugs.annotations.NonNull; +import io.jenkins.lib.versionnumber.JavaSpecificationVersion; +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.jar.JarFile; +import java.util.jar.Manifest; +import org.apache.maven.artifact.Artifact; +import org.apache.maven.plugin.MojoExecutionException; +import org.apache.maven.plugins.annotations.LifecyclePhase; +import org.apache.maven.plugins.annotations.Mojo; +import org.apache.maven.shared.transfer.artifact.DefaultArtifactCoordinate; +import org.apache.maven.shared.transfer.artifact.resolve.ArtifactResolverException; + +/** + * 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 { + setSurefireProperties(); + } + + private void setSurefireProperties() throws MojoExecutionException { + if (JavaSpecificationVersion.forCurrentJVM().isOlderThan(new JavaSpecificationVersion("9"))) { + // nothing to do prior to JEP 261 + return; + } + + String manifestEntry = getManifestEntry(wrap(resolveJenkinsWar())); + if (manifestEntry == null) { + // core older than 2.339, ignore + return; + } + + String argLine = buildArgLine(manifestEntry); + getLog().info("Setting jenkins.addOpens to " + argLine); + project.getProperties().setProperty("jenkins.addOpens", argLine); + } + + @NonNull + private Artifact resolveJenkinsWar() throws MojoExecutionException { + DefaultArtifactCoordinate artifactCoordinate = new DefaultArtifactCoordinate(); + artifactCoordinate.setGroupId("org.jenkins-ci.main"); + artifactCoordinate.setArtifactId("jenkins-war"); + artifactCoordinate.setVersion(findJenkinsVersion()); + artifactCoordinate.setExtension("war"); + + try { + return artifactResolver + .resolveArtifact(session.getProjectBuildingRequest(), artifactCoordinate) + .getArtifact(); + } catch (ArtifactResolverException e) { + throw new MojoExecutionException("Couldn't download artifact: ", e); + } + } + + @CheckForNull + private static String getManifestEntry(MavenArtifact artifact) throws MojoExecutionException { + File war = artifact.getFile(); + try (JarFile jarFile = new JarFile(war)) { + Manifest manifest = jarFile.getManifest(); + if (manifest == null) { + throw new MojoExecutionException("No manifest found in " + war); + } + return manifest.getMainAttributes().getValue("Add-Opens"); + } catch (IOException e) { + throw new MojoExecutionException("Failed to read MANIFEST.MF from " + war, e); + } + } + + @NonNull + private static String buildArgLine(String manifestEntry) { + List arguments = new ArrayList<>(); + for (String module : manifestEntry.split("\\s+")) { + if (!module.isEmpty()) { + arguments.add("--add-opens"); + arguments.add(module + "=ALL-UNNAMED"); + } + } + return String.join(" ", arguments); + } +} 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