From dd83b58b052f530ab51369a71d145a0e4f371031 Mon Sep 17 00:00:00 2001 From: Mark Ingram Date: Mon, 19 May 2014 13:21:50 +0100 Subject: [PATCH] Exact match for groupId excludes Previous to this commit, any groupId starting with one of the configured exclude would be excluded as well. This potentially leads to unintentional dependency filtering: for example the GroupIdFilter with an exclusion of "org.springframework" also removes "org.springframework.boot" dependencies. Add MatchingGroupIdFilter that uses an exact match instead. See #649 --- .../maven/AbstractDependencyFilterMojo.java | 7 ++--- .../boot/maven/MatchingGroupIdFilter.java | 28 +++++++++++++++++++ .../boot/maven/DependencyFilterMojoTests.java | 13 +++++++++ 3 files changed, 44 insertions(+), 4 deletions(-) create mode 100644 spring-boot-tools/spring-boot-maven-plugin/src/main/java/org/springframework/boot/maven/MatchingGroupIdFilter.java diff --git a/spring-boot-tools/spring-boot-maven-plugin/src/main/java/org/springframework/boot/maven/AbstractDependencyFilterMojo.java b/spring-boot-tools/spring-boot-maven-plugin/src/main/java/org/springframework/boot/maven/AbstractDependencyFilterMojo.java index 9ae658f1c8f..5f6a8aafc85 100644 --- a/spring-boot-tools/spring-boot-maven-plugin/src/main/java/org/springframework/boot/maven/AbstractDependencyFilterMojo.java +++ b/spring-boot-tools/spring-boot-maven-plugin/src/main/java/org/springframework/boot/maven/AbstractDependencyFilterMojo.java @@ -28,7 +28,6 @@ import org.apache.maven.shared.artifact.filter.collection.ArtifactFilterExceptio import org.apache.maven.shared.artifact.filter.collection.ArtifactIdFilter; import org.apache.maven.shared.artifact.filter.collection.ArtifactsFilter; import org.apache.maven.shared.artifact.filter.collection.FilterArtifacts; -import org.apache.maven.shared.artifact.filter.collection.GroupIdFilter; /** * A base mojo filtering the dependencies of the project. @@ -48,14 +47,14 @@ public abstract class AbstractDependencyFilterMojo extends AbstractMojo { private List excludes; /** - * Comma separated list of groupId names to exclude. + * Comma separated list of groupId names to exclude (exact match). * @since 1.1 */ @Parameter(property = "excludeGroupIds", defaultValue = "") private String excludeGroupIds; /** - * Comma separated list of artifact names to exclude. + * Comma separated list of artifact names to exclude (exact match). * @since 1.1 */ @Parameter(property = "excludeArtifactIds", defaultValue = "") @@ -96,7 +95,7 @@ public abstract class AbstractDependencyFilterMojo extends AbstractMojo { } filters.addFilter(new ArtifactIdFilter("", cleanFilterConfig(this.excludeArtifactIds))); - filters.addFilter(new GroupIdFilter("", cleanFilterConfig(this.excludeGroupIds))); + filters.addFilter(new MatchingGroupIdFilter(cleanFilterConfig(this.excludeGroupIds))); if (this.excludes != null) { filters.addFilter(new ExcludeFilter(this.excludes)); } diff --git a/spring-boot-tools/spring-boot-maven-plugin/src/main/java/org/springframework/boot/maven/MatchingGroupIdFilter.java b/spring-boot-tools/spring-boot-maven-plugin/src/main/java/org/springframework/boot/maven/MatchingGroupIdFilter.java new file mode 100644 index 00000000000..a2f2632d26a --- /dev/null +++ b/spring-boot-tools/spring-boot-maven-plugin/src/main/java/org/springframework/boot/maven/MatchingGroupIdFilter.java @@ -0,0 +1,28 @@ +package org.springframework.boot.maven; + +import org.apache.maven.artifact.Artifact; +import org.apache.maven.shared.artifact.filter.collection.AbstractArtifactFeatureFilter; + +/** + * An {@link org.apache.maven.shared.artifact.filter.collection.ArtifactsFilter + * ArtifactsFilter} that filters by matching groupId. + * + * Preferred over the {@link org.apache.maven.shared.artifact.filter.collection.GroupIdFilter} due + * to that classes use of {@link String#startsWith} to match on prefix. + * + * @author Mark Ingram + * @since 1.1 + */ +public class MatchingGroupIdFilter extends AbstractArtifactFeatureFilter { + + /** + * Create a new instance with the CSV groupId values that should be excluded. + */ + public MatchingGroupIdFilter(String exclude) { + super("", exclude); + } + + protected String getArtifactFeature(Artifact artifact) { + return artifact.getGroupId(); + } +} diff --git a/spring-boot-tools/spring-boot-maven-plugin/src/test/java/org/springframework/boot/maven/DependencyFilterMojoTests.java b/spring-boot-tools/spring-boot-maven-plugin/src/test/java/org/springframework/boot/maven/DependencyFilterMojoTests.java index 1e9157a2a7c..4d51f765592 100644 --- a/spring-boot-tools/spring-boot-maven-plugin/src/test/java/org/springframework/boot/maven/DependencyFilterMojoTests.java +++ b/spring-boot-tools/spring-boot-maven-plugin/src/test/java/org/springframework/boot/maven/DependencyFilterMojoTests.java @@ -51,6 +51,19 @@ public class DependencyFilterMojoTests { assertSame("Wrong filtered artifact", artifact, artifacts.iterator().next()); } + @Test + public void filterGroupIdExactMatch() throws MojoExecutionException { + TestableDependencyFilterMojo mojo = new TestableDependencyFilterMojo( + Collections.emptyList(), "com.foo", ""); + + Artifact artifact = createArtifact("com.foo.bar", "one"); + Set artifacts = mojo.filterDependencies( + createArtifact("com.foo", "one"), createArtifact("com.foo", "two"), + artifact); + assertEquals("wrong filtering of artifacts", 1, artifacts.size()); + assertSame("Wrong filtered artifact", artifact, artifacts.iterator().next()); + } + private Artifact createArtifact(String groupId, String artifactId) { Artifact a = mock(Artifact.class); given(a.getGroupId()).willReturn(groupId);