diff --git a/.gitignore b/.gitignore
index dc9fe7310546..1f9be468fbb1 100644
--- a/.gitignore
+++ b/.gitignore
@@ -24,3 +24,4 @@ activemq-data
overridedb.*
*.iml
.idea
+.java-version
diff --git a/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-scopes-filering/pom.xml b/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-scopes-filering/pom.xml
new file mode 100644
index 000000000000..d60725db641e
--- /dev/null
+++ b/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-scopes-filering/pom.xml
@@ -0,0 +1,74 @@
+
+
+ 4.0.0
+ org.springframework.boot.maven.it
+ jar-scopes-filtering
+ 0.0.1.BUILD-SNAPSHOT
+ jar
+
+ UTF-8
+
+
+
+
+ @project.groupId@
+ @project.artifactId@
+ @project.version@
+
+
+
+ repackage
+
+
+
+ compile
+ runtime
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-jar-plugin
+ 2.4
+
+
+
+ some.random.Main
+
+
+ Foo
+
+
+
+
+
+
+
+
+ org.springframework
+ spring-context
+ 3.2.3.RELEASE
+
+
+ org.springframework
+ spring-beans
+ 3.2.3.RELEASE
+ runtime
+
+
+ javax.servlet
+ javax.servlet-api
+ 3.0.1
+ runtime
+
+
+ org.slf4j
+ jcl-over-slf4j
+ @slf4j.version@
+ provided
+
+
+
diff --git a/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-scopes-filering/src/main/java/org/test/SampleApplication.java b/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-scopes-filering/src/main/java/org/test/SampleApplication.java
new file mode 100644
index 000000000000..0b3b431677d0
--- /dev/null
+++ b/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-scopes-filering/src/main/java/org/test/SampleApplication.java
@@ -0,0 +1,8 @@
+package org.test;
+
+public class SampleApplication {
+
+ public static void main(String[] args) {
+ }
+
+}
diff --git a/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-scopes-filering/verify.groovy b/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-scopes-filering/verify.groovy
new file mode 100644
index 000000000000..2a4b3d773f63
--- /dev/null
+++ b/spring-boot-tools/spring-boot-maven-plugin/src/it/jar-scopes-filering/verify.groovy
@@ -0,0 +1,20 @@
+import java.io.*;
+import org.springframework.boot.maven.*;
+
+Verify.verifyJar(
+ new File( basedir, "target/jar-scopes-filtering-0.0.1.BUILD-SNAPSHOT.jar" ), "some.random.Main"
+);
+
+Verify.verifyJarContain(
+ new File( basedir, "target/jar-scopes-filtering-0.0.1.BUILD-SNAPSHOT.jar" ), "some.random.Main", "lib/spring-context-3.2.3.RELEASE.jar"
+);
+
+Verify.verifyJarNotContain(
+ new File( basedir, "target/jar-scopes-filtering-0.0.1.BUILD-SNAPSHOT.jar" ), "some.random.Main", "lib/jcl-over-slf4j-1.7.6.jar"
+);
+
+Verify.verifyJarContain(
+ new File( basedir, "target/jar-scopes-filtering-0.0.1.BUILD-SNAPSHOT.jar" ), "some.random.Main", "lib/spring-beans-3.2.3.RELEASE.jar"
+);
+
+
diff --git a/spring-boot-tools/spring-boot-maven-plugin/src/main/java/org/springframework/boot/maven/ArtifactsLibraries.java b/spring-boot-tools/spring-boot-maven-plugin/src/main/java/org/springframework/boot/maven/ArtifactsLibraries.java
index 2e672703e25d..59cd1f0e98a7 100644
--- a/spring-boot-tools/spring-boot-maven-plugin/src/main/java/org/springframework/boot/maven/ArtifactsLibraries.java
+++ b/spring-boot-tools/spring-boot-maven-plugin/src/main/java/org/springframework/boot/maven/ArtifactsLibraries.java
@@ -17,8 +17,10 @@
package org.springframework.boot.maven;
import java.io.IOException;
+import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
+import java.util.List;
import java.util.Map;
import java.util.Set;
@@ -35,26 +37,34 @@
*/
public class ArtifactsLibraries implements Libraries {
- private static final Map SCOPES;
+ private static final Map DEFAULT_SCOPES;
static {
Map scopes = new HashMap();
scopes.put(Artifact.SCOPE_COMPILE, LibraryScope.COMPILE);
scopes.put(Artifact.SCOPE_RUNTIME, LibraryScope.RUNTIME);
scopes.put(Artifact.SCOPE_PROVIDED, LibraryScope.PROVIDED);
- SCOPES = Collections.unmodifiableMap(scopes);
+ DEFAULT_SCOPES = Collections.unmodifiableMap(scopes);
}
private final Set artifacts;
+ private final List userScopes;
+
public ArtifactsLibraries(Set artifacts) {
this.artifacts = artifacts;
+ this.userScopes = new ArrayList( DEFAULT_SCOPES.keySet() );
}
+ public ArtifactsLibraries(Set artifacts, List userScopes) {
+ this.artifacts = artifacts;
+ this.userScopes = ( userScopes == null || userScopes.isEmpty() ) ? new ArrayList( DEFAULT_SCOPES.keySet() ) : userScopes;
+ }
+
@Override
public void doWithLibraries(LibraryCallback callback) throws IOException {
for (Artifact artifact : this.artifacts) {
- LibraryScope scope = SCOPES.get(artifact.getScope());
- if (scope != null && artifact.getFile() != null) {
+ LibraryScope scope = DEFAULT_SCOPES.get(artifact.getScope());
+ if (scope != null && artifact.getFile() != null && userScopes.contains( artifact.getScope() )) {
callback.library(artifact.getFile(), scope);
}
}
diff --git a/spring-boot-tools/spring-boot-maven-plugin/src/main/java/org/springframework/boot/maven/RepackageMojo.java b/spring-boot-tools/spring-boot-maven-plugin/src/main/java/org/springframework/boot/maven/RepackageMojo.java
index 36fa4cc18e51..62f18e45e38a 100644
--- a/spring-boot-tools/spring-boot-maven-plugin/src/main/java/org/springframework/boot/maven/RepackageMojo.java
+++ b/spring-boot-tools/spring-boot-maven-plugin/src/main/java/org/springframework/boot/maven/RepackageMojo.java
@@ -18,6 +18,7 @@
import java.io.File;
import java.io.IOException;
+import java.util.List;
import java.util.concurrent.TimeUnit;
import java.util.jar.JarFile;
@@ -95,6 +96,12 @@ public class RepackageMojo extends AbstractMojo {
@Parameter
private LayoutType layout;
+ /**
+ * list of artifact scopes you want to have repackaged in the jar
+ */
+ @Parameter
+ private List scopes;
+
@Override
public void execute() throws MojoExecutionException, MojoFailureException {
File source = this.project.getArtifact().getFile();
@@ -122,7 +129,7 @@ protected String findMainMethod(JarFile source) throws IOException {
getLog().info("Layout: " + this.layout);
repackager.setLayout(this.layout.layout());
}
- Libraries libraries = new ArtifactsLibraries(this.project.getArtifacts());
+ Libraries libraries = new ArtifactsLibraries(this.project.getArtifacts(), this.scopes);
try {
repackager.repackage(target, libraries);
}
diff --git a/spring-boot-tools/spring-boot-maven-plugin/src/test/java/org/springframework/boot/maven/Verify.java b/spring-boot-tools/spring-boot-maven-plugin/src/test/java/org/springframework/boot/maven/Verify.java
index 84a3ff75e29b..7d6db2f641e9 100644
--- a/spring-boot-tools/spring-boot-maven-plugin/src/test/java/org/springframework/boot/maven/Verify.java
+++ b/spring-boot-tools/spring-boot-maven-plugin/src/test/java/org/springframework/boot/maven/Verify.java
@@ -26,6 +26,7 @@
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.assertFalse;
/**
* Verification utility for use with maven-invoker-plugin verification scripts.
@@ -38,6 +39,14 @@ public static void verifyJar(File file) throws Exception {
new JarArchiveVerification(file, "org.test.SampleApplication").verify();
}
+ public static void verifyJarContain(File file, String main, String path) throws Exception {
+ new JarArchiveVerification(file, main).verify(path);
+ }
+
+ public static void verifyJarNotContain(File file, String main, String path) throws Exception {
+ new JarArchiveVerification(file, main).verifyNot(path);
+ }
+
public static void verifyJar(File file, String main) throws Exception {
new JarArchiveVerification(file, main).verify();
}
@@ -73,6 +82,39 @@ public void verify() throws Exception {
zipFile.close();
}
+ public void verify(String path) throws Exception {
+ assertTrue("Archive missing", this.file.exists());
+ assertTrue("Archive not a file", this.file.isFile());
+
+ ZipFile zipFile = new ZipFile(this.file);
+ Enumeration extends ZipEntry> entries = zipFile.entries();
+ Map zipMap = new HashMap();
+ while (entries.hasMoreElements()) {
+ ZipEntry zipEntry = entries.nextElement();
+ zipMap.put(zipEntry.getName(), zipEntry);
+ }
+ verifyZipEntries(zipFile, zipMap);
+ assertTrue("archive not containing file with path:" + path, zipMap.containsKey( path ) );
+ zipFile.close();
+ }
+
+ public void verifyNot(String path) throws Exception {
+ assertTrue("Archive missing", this.file.exists());
+ assertTrue("Archive not a file", this.file.isFile());
+
+ ZipFile zipFile = new ZipFile(this.file);
+ Enumeration extends ZipEntry> entries = zipFile.entries();
+ Map zipMap = new HashMap();
+ while (entries.hasMoreElements()) {
+ ZipEntry zipEntry = entries.nextElement();
+ zipMap.put(zipEntry.getName(), zipEntry);
+ }
+ verifyZipEntries(zipFile, zipMap);
+ assertFalse("archive containing file with path:" + path, zipMap.containsKey( path ) );
+ zipFile.close();
+ }
+
+
protected void verifyZipEntries(ZipFile zipFile, Map entries)
throws Exception {
verifyManifest(zipFile, entries.get("META-INF/MANIFEST.MF"));
@@ -98,7 +140,7 @@ protected final void assertHasEntryNameStartingWith(
private static class JarArchiveVerification extends AbstractArchiveVerification {
- private final String main;
+ private String main;
public JarArchiveVerification(File file, String main) {
super(file);