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 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 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);