From f05dd75e40001314c301296c3c8239a6b3a6c549 Mon Sep 17 00:00:00 2001 From: Basil Crow Date: Wed, 30 Mar 2022 11:16:11 -0700 Subject: [PATCH 1/6] Dynamically apply `Add-Opens` directives from `MANIFEST.MF` --- .../plugins/hpi/AbstractJenkinsMojo.java | 33 ++++++++++++++ .../maven/plugins/hpi/InitializeMojo.java | 44 +++++++++++++++++++ .../resources/META-INF/plexus/components.xml | 1 + 3 files changed, 78 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/AbstractJenkinsMojo.java b/src/main/java/org/jenkinsci/maven/plugins/hpi/AbstractJenkinsMojo.java index bfd62f83dd..3fa98859dc 100644 --- a/src/main/java/org/jenkinsci/maven/plugins/hpi/AbstractJenkinsMojo.java +++ b/src/main/java/org/jenkinsci/maven/plugins/hpi/AbstractJenkinsMojo.java @@ -1,5 +1,6 @@ package org.jenkinsci.maven.plugins.hpi; +import edu.umd.cs.findbugs.annotations.CheckForNull; import hudson.util.VersionNumber; import io.jenkins.lib.versionnumber.JavaSpecificationVersion; import java.io.DataInputStream; @@ -7,6 +8,7 @@ import java.io.IOException; import java.io.InputStream; import java.util.jar.JarFile; +import java.util.jar.Manifest; import java.util.zip.ZipEntry; import org.apache.maven.artifact.Artifact; import org.apache.maven.artifact.factory.ArtifactFactory; @@ -140,6 +142,37 @@ private Artifact resolveJenkinsCore() throws MojoExecutionException { } } + @CheckForNull + protected String getAddOpens() throws MojoExecutionException { + Artifact artifact = resolveJenkinsWar(); + File war = wrap(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); + } + } + + 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); + } + } + protected MavenArtifact wrap(Artifact a) { return new MavenArtifact( a, 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..3a3c6d60f5 --- /dev/null +++ b/src/main/java/org/jenkinsci/maven/plugins/hpi/InitializeMojo.java @@ -0,0 +1,44 @@ +package org.jenkinsci.maven.plugins.hpi; + +import io.jenkins.lib.versionnumber.JavaSpecificationVersion; +import java.util.ArrayList; +import java.util.List; +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 { + String addOpens = getAddOpens(); + if (addOpens != null + && JavaSpecificationVersion.forCurrentJVM().isNewerThanOrEqualTo(new JavaSpecificationVersion("9"))) { + String argLine = project.getProperties().getProperty("argLine"); + if (argLine != null) { + argLine += " " + buildargLine(addOpens); + } else { + argLine = buildargLine(addOpens); + } + getLog().info("Setting argLine to " + argLine); + project.getProperties().setProperty("argLine", argLine); + } + } + + private static String buildargLine(String addOpens) { + List arguments = new ArrayList<>(); + for (String module : addOpens.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 From ec05ea0652662b0699fa7ba4cd55f00f344cba52 Mon Sep 17 00:00:00 2001 From: Basil Crow Date: Wed, 30 Mar 2022 11:32:52 -0700 Subject: [PATCH 2/6] Proper camel case --- .../org/jenkinsci/maven/plugins/hpi/InitializeMojo.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/jenkinsci/maven/plugins/hpi/InitializeMojo.java b/src/main/java/org/jenkinsci/maven/plugins/hpi/InitializeMojo.java index 3a3c6d60f5..9d258f56ba 100644 --- a/src/main/java/org/jenkinsci/maven/plugins/hpi/InitializeMojo.java +++ b/src/main/java/org/jenkinsci/maven/plugins/hpi/InitializeMojo.java @@ -22,16 +22,16 @@ public void execute() throws MojoExecutionException { && JavaSpecificationVersion.forCurrentJVM().isNewerThanOrEqualTo(new JavaSpecificationVersion("9"))) { String argLine = project.getProperties().getProperty("argLine"); if (argLine != null) { - argLine += " " + buildargLine(addOpens); + argLine += " " + buildArgLine(addOpens); } else { - argLine = buildargLine(addOpens); + argLine = buildArgLine(addOpens); } getLog().info("Setting argLine to " + argLine); project.getProperties().setProperty("argLine", argLine); } } - private static String buildargLine(String addOpens) { + private static String buildArgLine(String addOpens) { List arguments = new ArrayList<>(); for (String module : addOpens.split("\\s+")) { if (!module.isEmpty()) { From 365c153bd78f4557b0aab9b5aac46c140b8f77b1 Mon Sep 17 00:00:00 2001 From: Basil Crow Date: Wed, 30 Mar 2022 14:43:30 -0700 Subject: [PATCH 3/6] Refactor into a method --- .../maven/plugins/hpi/InitializeMojo.java | 31 +++++++++++++------ 1 file changed, 21 insertions(+), 10 deletions(-) diff --git a/src/main/java/org/jenkinsci/maven/plugins/hpi/InitializeMojo.java b/src/main/java/org/jenkinsci/maven/plugins/hpi/InitializeMojo.java index 9d258f56ba..d4f99b7c62 100644 --- a/src/main/java/org/jenkinsci/maven/plugins/hpi/InitializeMojo.java +++ b/src/main/java/org/jenkinsci/maven/plugins/hpi/InitializeMojo.java @@ -17,18 +17,29 @@ 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 + return; + } + String addOpens = getAddOpens(); - if (addOpens != null - && JavaSpecificationVersion.forCurrentJVM().isNewerThanOrEqualTo(new JavaSpecificationVersion("9"))) { - String argLine = project.getProperties().getProperty("argLine"); - if (argLine != null) { - argLine += " " + buildArgLine(addOpens); - } else { - argLine = buildArgLine(addOpens); - } - getLog().info("Setting argLine to " + argLine); - project.getProperties().setProperty("argLine", argLine); + if (addOpens == null) { + // core older than 2.339, ignore + return; + } + + String argLine = project.getProperties().getProperty("argLine"); + if (argLine != null) { + argLine += " " + buildArgLine(addOpens); + } else { + argLine = buildArgLine(addOpens); } + getLog().info("Setting argLine to " + argLine); + project.getProperties().setProperty("argLine", argLine); } private static String buildArgLine(String addOpens) { From 4150f312fa184b698a5d82d587135daf4c3025fb Mon Sep 17 00:00:00 2001 From: Basil Crow Date: Thu, 31 Mar 2022 07:43:52 -0700 Subject: [PATCH 4/6] https://github.com/jenkinsci/maven-hpi-plugin/pull/322#discussion_r839562552 --- .../plugins/hpi/AbstractJenkinsMojo.java | 33 ---------------- .../maven/plugins/hpi/InitializeMojo.java | 39 +++++++++++++++++++ 2 files changed, 39 insertions(+), 33 deletions(-) diff --git a/src/main/java/org/jenkinsci/maven/plugins/hpi/AbstractJenkinsMojo.java b/src/main/java/org/jenkinsci/maven/plugins/hpi/AbstractJenkinsMojo.java index 3fa98859dc..bfd62f83dd 100644 --- a/src/main/java/org/jenkinsci/maven/plugins/hpi/AbstractJenkinsMojo.java +++ b/src/main/java/org/jenkinsci/maven/plugins/hpi/AbstractJenkinsMojo.java @@ -1,6 +1,5 @@ package org.jenkinsci.maven.plugins.hpi; -import edu.umd.cs.findbugs.annotations.CheckForNull; import hudson.util.VersionNumber; import io.jenkins.lib.versionnumber.JavaSpecificationVersion; import java.io.DataInputStream; @@ -8,7 +7,6 @@ import java.io.IOException; import java.io.InputStream; import java.util.jar.JarFile; -import java.util.jar.Manifest; import java.util.zip.ZipEntry; import org.apache.maven.artifact.Artifact; import org.apache.maven.artifact.factory.ArtifactFactory; @@ -142,37 +140,6 @@ private Artifact resolveJenkinsCore() throws MojoExecutionException { } } - @CheckForNull - protected String getAddOpens() throws MojoExecutionException { - Artifact artifact = resolveJenkinsWar(); - File war = wrap(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); - } - } - - 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); - } - } - protected MavenArtifact wrap(Artifact a) { return new MavenArtifact( a, diff --git a/src/main/java/org/jenkinsci/maven/plugins/hpi/InitializeMojo.java b/src/main/java/org/jenkinsci/maven/plugins/hpi/InitializeMojo.java index d4f99b7c62..5737a21b94 100644 --- a/src/main/java/org/jenkinsci/maven/plugins/hpi/InitializeMojo.java +++ b/src/main/java/org/jenkinsci/maven/plugins/hpi/InitializeMojo.java @@ -1,11 +1,19 @@ package org.jenkinsci.maven.plugins.hpi; +import edu.umd.cs.findbugs.annotations.CheckForNull; 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. @@ -52,4 +60,35 @@ private static String buildArgLine(String addOpens) { } return String.join(" ", arguments); } + + @CheckForNull + private String getAddOpens() throws MojoExecutionException { + Artifact artifact = resolveJenkinsWar(); + File war = wrap(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); + } + } + + 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); + } + } } From 0e11da26eaa63c6ec0e4355160adfaaa2702faa1 Mon Sep 17 00:00:00 2001 From: Basil Crow Date: Thu, 31 Mar 2022 07:55:17 -0700 Subject: [PATCH 5/6] https://github.com/jenkinsci/maven-hpi-plugin/pull/322#pullrequestreview-927511486 --- .../maven/plugins/hpi/InitializeMojo.java | 39 ++++++++----------- 1 file changed, 17 insertions(+), 22 deletions(-) diff --git a/src/main/java/org/jenkinsci/maven/plugins/hpi/InitializeMojo.java b/src/main/java/org/jenkinsci/maven/plugins/hpi/InitializeMojo.java index 5737a21b94..c0ad8ab299 100644 --- a/src/main/java/org/jenkinsci/maven/plugins/hpi/InitializeMojo.java +++ b/src/main/java/org/jenkinsci/maven/plugins/hpi/InitializeMojo.java @@ -34,35 +34,19 @@ private void setSurefireProperties() throws MojoExecutionException { return; } - String addOpens = getAddOpens(); - if (addOpens == null) { + String manifestEntry = getManifestEntry(); + if (manifestEntry == null) { // core older than 2.339, ignore return; } - String argLine = project.getProperties().getProperty("argLine"); - if (argLine != null) { - argLine += " " + buildArgLine(addOpens); - } else { - argLine = buildArgLine(addOpens); - } - getLog().info("Setting argLine to " + argLine); - project.getProperties().setProperty("argLine", argLine); - } - - private static String buildArgLine(String addOpens) { - List arguments = new ArrayList<>(); - for (String module : addOpens.split("\\s+")) { - if (!module.isEmpty()) { - arguments.add("--add-opens"); - arguments.add(module + "=ALL-UNNAMED"); - } - } - return String.join(" ", arguments); + String argLine = buildArgLine(manifestEntry); + getLog().info("Setting jenkins.addOpens to " + argLine); + project.getProperties().setProperty("jenkins.addOpens", argLine); } @CheckForNull - private String getAddOpens() throws MojoExecutionException { + private String getManifestEntry() throws MojoExecutionException { Artifact artifact = resolveJenkinsWar(); File war = wrap(artifact).getFile(); try (JarFile jarFile = new JarFile(war)) { @@ -91,4 +75,15 @@ private Artifact resolveJenkinsWar() throws MojoExecutionException { throw new MojoExecutionException("Couldn't download artifact: ", e); } } + + 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); + } } From 5e6d8273b0c19ca51b1284958b304b4b4a769e47 Mon Sep 17 00:00:00 2001 From: Basil Crow Date: Thu, 31 Mar 2022 09:31:05 -0700 Subject: [PATCH 6/6] Fixups --- .../maven/plugins/hpi/InitializeMojo.java | 36 ++++++++++--------- 1 file changed, 19 insertions(+), 17 deletions(-) diff --git a/src/main/java/org/jenkinsci/maven/plugins/hpi/InitializeMojo.java b/src/main/java/org/jenkinsci/maven/plugins/hpi/InitializeMojo.java index c0ad8ab299..6f1d542992 100644 --- a/src/main/java/org/jenkinsci/maven/plugins/hpi/InitializeMojo.java +++ b/src/main/java/org/jenkinsci/maven/plugins/hpi/InitializeMojo.java @@ -1,6 +1,7 @@ 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; @@ -30,11 +31,11 @@ public void execute() throws MojoExecutionException { private void setSurefireProperties() throws MojoExecutionException { if (JavaSpecificationVersion.forCurrentJVM().isOlderThan(new JavaSpecificationVersion("9"))) { - // nothing to do + // nothing to do prior to JEP 261 return; } - String manifestEntry = getManifestEntry(); + String manifestEntry = getManifestEntry(wrap(resolveJenkinsWar())); if (manifestEntry == null) { // core older than 2.339, ignore return; @@ -45,21 +46,7 @@ private void setSurefireProperties() throws MojoExecutionException { project.getProperties().setProperty("jenkins.addOpens", argLine); } - @CheckForNull - private String getManifestEntry() throws MojoExecutionException { - Artifact artifact = resolveJenkinsWar(); - File war = wrap(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 Artifact resolveJenkinsWar() throws MojoExecutionException { DefaultArtifactCoordinate artifactCoordinate = new DefaultArtifactCoordinate(); artifactCoordinate.setGroupId("org.jenkins-ci.main"); @@ -76,6 +63,21 @@ private Artifact resolveJenkinsWar() throws MojoExecutionException { } } + @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+")) {