diff --git a/spring-package-maven-plugin/src/it/jar/pom.xml b/spring-package-maven-plugin/src/it/jar/pom.xml
index 2d1b98f476..8cac9be406 100644
--- a/spring-package-maven-plugin/src/it/jar/pom.xml
+++ b/spring-package-maven-plugin/src/it/jar/pom.xml
@@ -20,6 +20,19 @@
+
+ org.apache.maven.plugins
+ maven-jar-plugin
+ 2.4
+
+
+
+ some.random.Main
+ Foo
+
+
+
+
diff --git a/spring-package-maven-plugin/src/it/jar/verify.groovy b/spring-package-maven-plugin/src/it/jar/verify.groovy
index 268ad5f861..9af0c9b1cb 100644
--- a/spring-package-maven-plugin/src/it/jar/verify.groovy
+++ b/spring-package-maven-plugin/src/it/jar/verify.groovy
@@ -2,6 +2,6 @@ import java.io.*;
import org.springframework.maven.packaging.*;
Verify.verifyJar(
- new File( basedir, "target/jar-0.0.1.BUILD-SNAPSHOT.jar" )
+ new File( basedir, "target/jar-0.0.1.BUILD-SNAPSHOT.jar" ), "some.random.Main"
);
diff --git a/spring-package-maven-plugin/src/it/war/pom.xml b/spring-package-maven-plugin/src/it/war/pom.xml
index 6d659a6036..01b1234cae 100644
--- a/spring-package-maven-plugin/src/it/war/pom.xml
+++ b/spring-package-maven-plugin/src/it/war/pom.xml
@@ -26,6 +26,11 @@
2.3
false
+
+
+ Foo
+
+
diff --git a/spring-package-maven-plugin/src/main/java/org/springframework/maven/packaging/ExecutableArchiveMojo.java b/spring-package-maven-plugin/src/main/java/org/springframework/maven/packaging/ExecutableArchiveMojo.java
index 4605f73e1a..f2004d132b 100644
--- a/spring-package-maven-plugin/src/main/java/org/springframework/maven/packaging/ExecutableArchiveMojo.java
+++ b/spring-package-maven-plugin/src/main/java/org/springframework/maven/packaging/ExecutableArchiveMojo.java
@@ -23,6 +23,8 @@ import java.io.IOException;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
+import java.util.jar.Attributes;
+import java.util.jar.Attributes.Name;
import org.apache.maven.archiver.MavenArchiver;
import org.apache.maven.artifact.Artifact;
@@ -37,6 +39,7 @@ import org.apache.maven.plugins.annotations.ResolutionScope;
import org.apache.maven.project.MavenProjectHelper;
import org.codehaus.plexus.archiver.Archiver;
import org.codehaus.plexus.archiver.jar.JarArchiver;
+import org.codehaus.plexus.archiver.jar.Manifest;
import org.codehaus.plexus.archiver.zip.ZipEntry;
import org.codehaus.plexus.archiver.zip.ZipFile;
import org.codehaus.plexus.archiver.zip.ZipResource;
@@ -55,6 +58,7 @@ import org.sonatype.aether.util.artifact.DefaultArtifact;
* be executed from the command line using {@literal java -jar}.
*
* @author Phillip Webb
+ * @author Dave Syer
*/
@Mojo(name = "package", defaultPhase = LifecyclePhase.PACKAGE, requiresProject = true, threadSafe = true, requiresDependencyResolution = ResolutionScope.COMPILE_PLUS_RUNTIME, requiresDependencyCollection = ResolutionScope.COMPILE_PLUS_RUNTIME)
public class ExecutableArchiveMojo extends AbstractExecutableArchiveMojo {
@@ -135,7 +139,6 @@ public class ExecutableArchiveMojo extends AbstractExecutableArchiveMojo {
private File createArchive() throws MojoExecutionException {
File archiveFile = getTargetFile();
MavenArchiver archiver = new MavenArchiver();
- customizeArchiveConfiguration();
archiver.setArchiver(this.jarArchiver);
archiver.setOutputFile(archiveFile);
@@ -143,7 +146,9 @@ public class ExecutableArchiveMojo extends AbstractExecutableArchiveMojo {
try {
getLog().info("Modifying archive: " + archiveFile);
- copyContent(archiver, getProject().getArtifact().getFile());
+ Manifest manifest = copyContent(archiver, getProject().getArtifact()
+ .getFile());
+ customizeArchiveConfiguration(manifest);
addLibs(archiver);
ZipFile zipFile = addLauncherClasses(archiver);
try {
@@ -160,7 +165,7 @@ public class ExecutableArchiveMojo extends AbstractExecutableArchiveMojo {
}
}
- private void copyContent(MavenArchiver archiver, File file) throws IOException {
+ private Manifest copyContent(MavenArchiver archiver, File file) throws IOException {
FileInputStream input = new FileInputStream(file);
File original = new File(this.outputDirectory, "original.jar");
@@ -169,17 +174,26 @@ public class ExecutableArchiveMojo extends AbstractExecutableArchiveMojo {
input.close();
output.close();
+ Manifest manifest = new Manifest();
ZipFile zipFile = new ZipFile(original);
Enumeration extends ZipEntry> entries = zipFile.getEntries();
while (entries.hasMoreElements()) {
ZipEntry entry = entries.nextElement();
- if (!entry.isDirectory()
- && !entry.getName().toUpperCase().equals("/META-INF/MANIFEST.MF")) {
+ if (!entry.isDirectory()) {
ZipResource zipResource = new ZipResource(zipFile, entry);
- archiver.getArchiver().addResource(zipResource, entry.getName(), -1);
+ getLog().debug("Copying resource: " + entry.getName());
+ if (!entry.getName().toUpperCase().equals("META-INF/MANIFEST.MF")) {
+ archiver.getArchiver().addResource(zipResource, entry.getName(), -1);
+ }
+ else {
+ getLog().info("Found existing manifest");
+ manifest = new Manifest(zipResource.getContents());
+ }
}
}
+ return manifest;
+
}
private File getTargetFile() {
@@ -191,13 +205,21 @@ public class ExecutableArchiveMojo extends AbstractExecutableArchiveMojo {
+ getExtension());
}
- private void customizeArchiveConfiguration() throws MojoExecutionException {
+ private void customizeArchiveConfiguration(Manifest manifest)
+ throws MojoExecutionException {
getArchiveConfiguration().setForced(this.forceCreation);
+
+ Attributes attributes = manifest.getMainAttributes();
+ for (Object name : attributes.keySet()) {
+ String value = attributes.getValue((Name) name);
+ getLog().debug("Existing manifest entry: " + name + "=" + value);
+ getArchiveConfiguration().addManifestEntry(name.toString(), value);
+ }
+
String startClass = getStartClass();
- getArchiveConfiguration().getManifestEntries().put(MAIN_CLASS_ATTRIBUTE,
+ getArchiveConfiguration().addManifestEntry(MAIN_CLASS_ATTRIBUTE,
getArchiveHelper().getLauncherClass());
- getArchiveConfiguration().getManifestEntries().put(START_CLASS_ATTRIBUTE,
- startClass);
+ getArchiveConfiguration().addManifestEntry(START_CLASS_ATTRIBUTE, startClass);
}
private void addLibs(MavenArchiver archiver) throws MojoExecutionException {
diff --git a/spring-package-maven-plugin/src/main/java/org/springframework/maven/packaging/ExecutableJarHelper.java b/spring-package-maven-plugin/src/main/java/org/springframework/maven/packaging/ExecutableJarHelper.java
index 9973721835..b2d19b05f5 100644
--- a/spring-package-maven-plugin/src/main/java/org/springframework/maven/packaging/ExecutableJarHelper.java
+++ b/spring-package-maven-plugin/src/main/java/org/springframework/maven/packaging/ExecutableJarHelper.java
@@ -26,6 +26,7 @@ import org.apache.maven.artifact.Artifact;
* Help build an executable JAR file.
*
* @author Phillip Webb
+ * @author Dave Syer
*/
public class ExecutableJarHelper implements ArchiveHelper {
diff --git a/spring-package-maven-plugin/src/main/java/org/springframework/maven/packaging/ExecutableWarHelper.java b/spring-package-maven-plugin/src/main/java/org/springframework/maven/packaging/ExecutableWarHelper.java
index c508caf732..4e2f7ffac1 100644
--- a/spring-package-maven-plugin/src/main/java/org/springframework/maven/packaging/ExecutableWarHelper.java
+++ b/spring-package-maven-plugin/src/main/java/org/springframework/maven/packaging/ExecutableWarHelper.java
@@ -26,6 +26,7 @@ import org.apache.maven.artifact.Artifact;
* Build an executable WAR file.
*
* @author Phillip Webb
+ * @author Dave Syer
*/
public class ExecutableWarHelper implements ArchiveHelper {
diff --git a/spring-package-maven-plugin/src/test/java/org/springframework/maven/packaging/Verify.java b/spring-package-maven-plugin/src/test/java/org/springframework/maven/packaging/Verify.java
index 1caa3714ba..7727acb2ff 100644
--- a/spring-package-maven-plugin/src/test/java/org/springframework/maven/packaging/Verify.java
+++ b/spring-package-maven-plugin/src/test/java/org/springframework/maven/packaging/Verify.java
@@ -35,7 +35,11 @@ import static org.junit.Assert.assertTrue;
public class Verify {
public static void verifyJar(File file) throws Exception {
- new JarArchiveVerification(file).verify();
+ new JarArchiveVerification(file, "org.test.SampleApplication").verify();
+ }
+
+ public static void verifyJar(File file, String main) throws Exception {
+ new JarArchiveVerification(file, main).verify();
}
public static void verifyWar(File file) throws Exception {
@@ -90,8 +94,11 @@ public class Verify {
private static class JarArchiveVerification extends AbstractArchiveVerification {
- public JarArchiveVerification(File file) {
+ private String main;
+
+ public JarArchiveVerification(File file, String main) {
super(file);
+ this.main = main;
}
@Override
@@ -111,8 +118,8 @@ public class Verify {
protected void verifyManifest(Manifest manifest) throws Exception {
assertEquals("org.springframework.launcher.JarLauncher", manifest
.getMainAttributes().getValue("Main-Class"));
- assertEquals("org.test.SampleApplication", manifest.getMainAttributes()
- .getValue("Start-Class"));
+ assertEquals(this.main, manifest.getMainAttributes().getValue("Start-Class"));
+ assertEquals("Foo", manifest.getMainAttributes().getValue("Not-Used"));
}
}
@@ -143,6 +150,7 @@ public class Verify {
.getMainAttributes().getValue("Main-Class"));
assertEquals("org.test.SampleApplication", manifest.getMainAttributes()
.getValue("Start-Class"));
+ assertEquals("Foo", manifest.getMainAttributes().getValue("Not-Used"));
}
}