diff options
author | gjoranv <gv@yahooinc.com> | 2023-07-01 00:51:35 +0200 |
---|---|---|
committer | gjoranv <gv@yahooinc.com> | 2023-07-03 22:37:54 +0200 |
commit | 9e5b33ba18795bc13e65e6c533be3dfab2a18d73 (patch) | |
tree | e7b80f23c5a904fa70c16ab041934ffa50c3b674 /bundle-plugin | |
parent | 9be525ec6f6fe210f3fa484a911f7bc0d539a33a (diff) |
Add new mojo to create X-JDisc-Provided-Artifact manifest header.
Diffstat (limited to 'bundle-plugin')
-rw-r--r-- | bundle-plugin/src/main/java/com/yahoo/container/plugin/mojo/GenerateProvidedArtifactManifestMojo.java | 107 |
1 files changed, 107 insertions, 0 deletions
diff --git a/bundle-plugin/src/main/java/com/yahoo/container/plugin/mojo/GenerateProvidedArtifactManifestMojo.java b/bundle-plugin/src/main/java/com/yahoo/container/plugin/mojo/GenerateProvidedArtifactManifestMojo.java new file mode 100644 index 00000000000..05b679f3bfe --- /dev/null +++ b/bundle-plugin/src/main/java/com/yahoo/container/plugin/mojo/GenerateProvidedArtifactManifestMojo.java @@ -0,0 +1,107 @@ +package com.yahoo.container.plugin.mojo; + +import org.apache.commons.io.FileUtils; +import org.apache.maven.plugin.AbstractMojo; +import org.apache.maven.plugin.MojoExecutionException; +import org.apache.maven.plugins.annotations.Mojo; +import org.apache.maven.plugins.annotations.Parameter; +import org.apache.maven.plugins.annotations.ResolutionScope; +import org.apache.maven.plugins.shade.DefaultShader; +import org.apache.maven.plugins.shade.ShadeRequest; +import org.apache.maven.plugins.shade.relocation.Relocator; +import org.apache.maven.plugins.shade.resource.ResourceTransformer; +import org.apache.maven.project.MavenProject; + +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.util.List; +import java.util.Set; +import java.util.jar.Attributes; +import java.util.jar.JarEntry; +import java.util.jar.JarFile; +import java.util.jar.JarOutputStream; +import java.util.jar.Manifest; + +/** + * @author gjoranv + */ +@Mojo(name = "generate-provided-artifact-manifest", requiresDependencyResolution = ResolutionScope.COMPILE, threadSafe = true) +public class GenerateProvidedArtifactManifestMojo extends AbstractMojo { + + @Parameter(defaultValue = "${project}") + public MavenProject project; + + @Parameter(defaultValue = "${project.build.directory}") + public File outputDirectory; + + + @Override + public void execute() throws MojoExecutionException { + var originalJar = project.getArtifact().getFile(); + var shadedJar = shadedJarFile(); + + var req = new ShadeRequest(); + req.setJars(Set.of(originalJar)); + req.setUberJar(shadedJar); + req.setResourceTransformers(List.of(new ProvidedArtifactsManifestUpdater())); + req.setRelocators(List.of()); + req.setFilters(List.of()); + + try { + new DefaultShader().shade(req); + } catch (IOException e) { + throw new MojoExecutionException(e); + } + try { + getLog().info("Replacing original jar with transformed jar"); + FileUtils.copyFile(shadedJar, originalJar); + } catch (IOException e) { + throw new MojoExecutionException(e); + } + } + + private File shadedJarFile() { + var a = project.getArtifact(); + var name = project.getArtifactId() + "-shaded." + a.getArtifactHandler().getExtension(); + return new File(outputDirectory, name); + } + + private static class ProvidedArtifactsManifestUpdater implements ResourceTransformer { + + private Manifest manifest; + + @Override + public boolean canTransformResource(String resource) { + return JarFile.MANIFEST_NAME.equalsIgnoreCase(resource); + } + + @SuppressWarnings("deprecation") + @Override + public void processResource(String resource, InputStream is, List<Relocator> relocators) throws IOException { + manifest = new Manifest(is); + Attributes attributes = manifest.getMainAttributes(); + var providedArtifacts = attributes.getValue("Class-Path"); + if (providedArtifacts == null) return; + + attributes.remove(new Attributes.Name( "Class-Path")); + attributes.putValue("X-JDisc-Provided-Artifact", providedArtifacts.replace(" ", ",")); + attributes.putValue("Created-By", "vespa container maven plugin"); + } + + @Override + public boolean hasTransformedResource() { + return true; + } + + @Override + public void modifyOutputStream(JarOutputStream os) throws IOException { + if (manifest == null) return; + + JarEntry jarEntry = new JarEntry(JarFile.MANIFEST_NAME); + os.putNextEntry(jarEntry); + manifest.write(os); + } + } + +} |