summaryrefslogtreecommitdiffstats
path: root/bundle-plugin
diff options
context:
space:
mode:
authorgjoranv <gv@yahooinc.com>2023-07-01 00:51:35 +0200
committergjoranv <gv@yahooinc.com>2023-07-03 22:37:54 +0200
commit9e5b33ba18795bc13e65e6c533be3dfab2a18d73 (patch)
treee7b80f23c5a904fa70c16ab041934ffa50c3b674 /bundle-plugin
parent9be525ec6f6fe210f3fa484a911f7bc0d539a33a (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.java107
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);
+ }
+ }
+
+}