Skip to content

Commit 5e0ca5a

Browse files
[MENFORCER-474] Filter dependency by scope on project level
We should filter dependencies scopes on project level, for transitive dependency tree we should not change defaults selectors.
1 parent 57746a1 commit 5e0ca5a

File tree

9 files changed

+60
-163
lines changed

9 files changed

+60
-163
lines changed

enforcer-rules/src/main/java/org/apache/maven/enforcer/rules/dependency/BannedDependenciesBase.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
*/
1919
package org.apache.maven.enforcer.rules.dependency;
2020

21+
import java.util.Collections;
2122
import java.util.List;
2223
import java.util.Objects;
2324

@@ -102,7 +103,7 @@ public void execute() throws EnforcerRuleException {
102103
}
103104
} else {
104105
StringBuilder messageBuilder = new StringBuilder();
105-
DependencyNode rootNode = resolveUtil.resolveTransitiveDependenciesVerbose();
106+
DependencyNode rootNode = resolveUtil.resolveTransitiveDependenciesVerbose(Collections.emptyList());
106107
if (!validate(rootNode, 0, messageBuilder)) {
107108
String message = "";
108109
if (getMessage() != null) {

enforcer-rules/src/main/java/org/apache/maven/enforcer/rules/dependency/DependencyConvergence.java

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -29,11 +29,8 @@
2929

3030
import org.apache.maven.enforcer.rule.api.EnforcerRuleException;
3131
import org.apache.maven.enforcer.rules.AbstractStandardEnforcerRule;
32-
import org.apache.maven.enforcer.rules.dependency.selector.AllLevelsOptionalDependencySelector;
33-
import org.apache.maven.enforcer.rules.dependency.selector.AllLevelsScopeDependencySelector;
3432
import org.apache.maven.enforcer.rules.utils.ArtifactUtils;
3533
import org.eclipse.aether.graph.DependencyNode;
36-
import org.eclipse.aether.util.graph.selector.ExclusionDependencySelector;
3734

3835
import static org.apache.maven.artifact.Artifact.SCOPE_PROVIDED;
3936
import static org.apache.maven.artifact.Artifact.SCOPE_TEST;
@@ -68,10 +65,7 @@ public DependencyConvergence(ResolveUtil resolveUtil) {
6865
@Override
6966
public void execute() throws EnforcerRuleException {
7067

71-
DependencyNode node = resolveUtil.resolveTransitiveDependenciesVerbose(
72-
new AllLevelsOptionalDependencySelector(),
73-
new AllLevelsScopeDependencySelector(excludedScopes),
74-
new ExclusionDependencySelector());
68+
DependencyNode node = resolveUtil.resolveTransitiveDependenciesVerbose(excludedScopes);
7569
dependencyVersionMap = new DependencyVersionMap().setUniqueVersions(uniqueVersions);
7670
node.accept(dependencyVersionMap);
7771

enforcer-rules/src/main/java/org/apache/maven/enforcer/rules/dependency/RequireUpperBoundDeps.java

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import javax.inject.Named;
2323

2424
import java.util.ArrayList;
25+
import java.util.Arrays;
2526
import java.util.Collections;
2627
import java.util.HashMap;
2728
import java.util.List;
@@ -34,15 +35,12 @@
3435
import org.apache.maven.artifact.versioning.OverConstrainedVersionException;
3536
import org.apache.maven.enforcer.rule.api.EnforcerRuleException;
3637
import org.apache.maven.enforcer.rules.AbstractStandardEnforcerRule;
37-
import org.apache.maven.enforcer.rules.dependency.selector.AllLevelsOptionalDependencySelector;
38-
import org.apache.maven.enforcer.rules.dependency.selector.AllLevelsScopeDependencySelector;
3938
import org.apache.maven.enforcer.rules.utils.ArtifactUtils;
4039
import org.apache.maven.enforcer.rules.utils.ParentNodeProvider;
4140
import org.apache.maven.enforcer.rules.utils.ParentsVisitor;
4241
import org.eclipse.aether.graph.DependencyNode;
4342
import org.eclipse.aether.graph.DependencyVisitor;
4443
import org.eclipse.aether.util.graph.manager.DependencyManagerUtils;
45-
import org.eclipse.aether.util.graph.selector.ExclusionDependencySelector;
4644

4745
import static org.apache.maven.artifact.Artifact.SCOPE_PROVIDED;
4846
import static org.apache.maven.artifact.Artifact.SCOPE_TEST;
@@ -103,10 +101,8 @@ public void setIncludes(List<String> includes) {
103101

104102
@Override
105103
public void execute() throws EnforcerRuleException {
106-
DependencyNode node = resolveUtil.resolveTransitiveDependenciesVerbose(
107-
new AllLevelsOptionalDependencySelector(),
108-
new AllLevelsScopeDependencySelector(SCOPE_TEST, SCOPE_PROVIDED),
109-
new ExclusionDependencySelector());
104+
DependencyNode node =
105+
resolveUtil.resolveTransitiveDependenciesVerbose(Arrays.asList(SCOPE_TEST, SCOPE_PROVIDED));
110106
upperBoundDepsVisitor = new RequireUpperBoundDepsVisitor()
111107
.setUniqueVersions(uniqueVersions)
112108
.setIncludes(includes);

enforcer-rules/src/main/java/org/apache/maven/enforcer/rules/dependency/ResolveUtil.java

Lines changed: 37 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -21,27 +21,30 @@
2121
import javax.inject.Inject;
2222
import javax.inject.Named;
2323

24+
import java.util.Arrays;
25+
import java.util.List;
2426
import java.util.Objects;
2527
import java.util.stream.Collectors;
2628

2729
import org.apache.maven.RepositoryUtils;
28-
import org.apache.maven.artifact.Artifact;
2930
import org.apache.maven.enforcer.rule.api.EnforcerRuleException;
3031
import org.apache.maven.execution.MavenSession;
3132
import org.apache.maven.model.DependencyManagement;
3233
import org.apache.maven.project.MavenProject;
3334
import org.eclipse.aether.DefaultRepositorySystemSession;
3435
import org.eclipse.aether.RepositorySystem;
36+
import org.eclipse.aether.RepositorySystemSession;
3537
import org.eclipse.aether.artifact.ArtifactTypeRegistry;
3638
import org.eclipse.aether.collection.CollectRequest;
3739
import org.eclipse.aether.collection.DependencyCollectionException;
38-
import org.eclipse.aether.collection.DependencySelector;
40+
import org.eclipse.aether.graph.Dependency;
3941
import org.eclipse.aether.graph.DependencyNode;
4042
import org.eclipse.aether.util.graph.manager.DependencyManagerUtils;
41-
import org.eclipse.aether.util.graph.selector.AndDependencySelector;
4243
import org.eclipse.aether.util.graph.transformer.ConflictResolver;
4344

4445
import static java.util.Optional.ofNullable;
46+
import static org.apache.maven.artifact.Artifact.SCOPE_PROVIDED;
47+
import static org.apache.maven.artifact.Artifact.SCOPE_TEST;
4548

4649
/**
4750
* Resolver helper class.
@@ -72,59 +75,59 @@ class ResolveUtil {
7275
* Please consult {@link ConflictResolver} and {@link DependencyManagerUtils}>
7376
* </p>
7477
*
75-
* @param selectors zero or more {@link DependencySelector} instances
78+
* @param excludedScopes a project dependency scope to excluded
7679
* @return a Dependency Node which is the root of the project's dependency tree
7780
* @throws EnforcerRuleException thrown if the lookup fails
7881
*/
79-
DependencyNode resolveTransitiveDependenciesVerbose(DependencySelector... selectors) throws EnforcerRuleException {
80-
return resolveTransitiveDependencies(true, selectors);
82+
DependencyNode resolveTransitiveDependenciesVerbose(List<String> excludedScopes) throws EnforcerRuleException {
83+
return resolveTransitiveDependencies(true, true, excludedScopes);
8184
}
8285

8386
/**
8487
* Retrieves the {@link DependencyNode} instance containing the result of the transitive dependency
8588
* for the current {@link MavenProject}.
8689
*
87-
* @param selectors zero or more {@link DependencySelector} instances
8890
* @return a Dependency Node which is the root of the project's dependency tree
8991
* @throws EnforcerRuleException thrown if the lookup fails
9092
*/
91-
DependencyNode resolveTransitiveDependencies(DependencySelector... selectors) throws EnforcerRuleException {
92-
return resolveTransitiveDependencies(false, selectors);
93+
DependencyNode resolveTransitiveDependencies() throws EnforcerRuleException {
94+
return resolveTransitiveDependencies(false, true, Arrays.asList(SCOPE_TEST, SCOPE_PROVIDED));
9395
}
9496

95-
private DependencyNode resolveTransitiveDependencies(boolean verbose, DependencySelector... selectors)
96-
throws EnforcerRuleException {
97+
private DependencyNode resolveTransitiveDependencies(
98+
boolean verbose, boolean excludeOptional, List<String> excludedScopes) throws EnforcerRuleException {
9799

98100
try {
101+
RepositorySystemSession repositorySystemSession = session.getRepositorySession();
102+
103+
if (verbose) {
104+
DefaultRepositorySystemSession defaultRepositorySystemSession =
105+
new DefaultRepositorySystemSession(repositorySystemSession);
106+
defaultRepositorySystemSession.setConfigProperty(ConflictResolver.CONFIG_PROP_VERBOSE, true);
107+
defaultRepositorySystemSession.setConfigProperty(DependencyManagerUtils.CONFIG_PROP_VERBOSE, true);
108+
repositorySystemSession = defaultRepositorySystemSession;
109+
}
110+
99111
MavenProject project = session.getCurrentProject();
100112
ArtifactTypeRegistry artifactTypeRegistry =
101113
session.getRepositorySession().getArtifactTypeRegistry();
102114

103-
DefaultRepositorySystemSession repositorySystemSession =
104-
new DefaultRepositorySystemSession(session.getRepositorySession());
105-
106-
if (selectors.length > 0) {
107-
repositorySystemSession.setDependencySelector(new AndDependencySelector(selectors));
108-
}
115+
List<Dependency> dependencies = project.getDependencies().stream()
116+
.filter(d -> !(excludeOptional && d.isOptional()))
117+
.filter(d -> !excludedScopes.contains(d.getScope()))
118+
.map(d -> RepositoryUtils.toDependency(d, artifactTypeRegistry))
119+
.collect(Collectors.toList());
109120

110-
if (verbose) {
111-
repositorySystemSession.setConfigProperty(ConflictResolver.CONFIG_PROP_VERBOSE, true);
112-
repositorySystemSession.setConfigProperty(DependencyManagerUtils.CONFIG_PROP_VERBOSE, true);
113-
}
114-
115-
CollectRequest collectRequest = new CollectRequest(
116-
project.getDependencies().stream()
121+
List<Dependency> managedDependencies = ofNullable(project.getDependencyManagement())
122+
.map(DependencyManagement::getDependencies)
123+
.map(list -> list.stream()
117124
.map(d -> RepositoryUtils.toDependency(d, artifactTypeRegistry))
118-
.collect(Collectors.toList()),
119-
ofNullable(project.getDependencyManagement())
120-
.map(DependencyManagement::getDependencies)
121-
.map(list -> list.stream()
122-
.map(d -> RepositoryUtils.toDependency(d, artifactTypeRegistry))
123-
.collect(Collectors.toList()))
124-
.orElse(null),
125-
project.getRemoteProjectRepositories());
126-
Artifact artifact = project.getArtifact();
127-
collectRequest.setRootArtifact(RepositoryUtils.toArtifact(artifact));
125+
.collect(Collectors.toList()))
126+
.orElse(null);
127+
128+
CollectRequest collectRequest =
129+
new CollectRequest(dependencies, managedDependencies, project.getRemoteProjectRepositories());
130+
collectRequest.setRootArtifact(RepositoryUtils.toArtifact(project.getArtifact()));
128131

129132
return repositorySystem
130133
.collectDependencies(repositorySystemSession, collectRequest)

enforcer-rules/src/main/java/org/apache/maven/enforcer/rules/dependency/selector/AllLevelsOptionalDependencySelector.java

Lines changed: 0 additions & 40 deletions
This file was deleted.

enforcer-rules/src/main/java/org/apache/maven/enforcer/rules/dependency/selector/AllLevelsScopeDependencySelector.java

Lines changed: 0 additions & 63 deletions
This file was deleted.

enforcer-rules/src/test/java/org/apache/maven/enforcer/rules/dependency/BannedDependenciesTest.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
import org.mockito.junit.jupiter.MockitoExtension;
3333

3434
import static org.assertj.core.api.Assertions.assertThatCode;
35+
import static org.mockito.ArgumentMatchers.anyList;
3536
import static org.mockito.Mockito.when;
3637

3738
/**
@@ -94,7 +95,7 @@ void excludesAndIncludesDoNotUseTransitiveDependencies() throws Exception {
9495
@Test
9596
void excludesUseTransitiveDependencies() throws Exception {
9697

97-
when(resolveUtil.resolveTransitiveDependenciesVerbose())
98+
when(resolveUtil.resolveTransitiveDependenciesVerbose(anyList()))
9899
.thenReturn(new DependencyNodeBuilder()
99100
.withType(DependencyNodeBuilder.Type.POM)
100101
.withChildNode(new DependencyNodeBuilder()
@@ -127,7 +128,7 @@ void excludesUseTransitiveDependencies() throws Exception {
127128
@Test
128129
void excludesAndIncludesUseTransitiveDependencies() throws Exception {
129130

130-
when(resolveUtil.resolveTransitiveDependenciesVerbose())
131+
when(resolveUtil.resolveTransitiveDependenciesVerbose(anyList()))
131132
.thenReturn(new DependencyNodeBuilder()
132133
.withType(DependencyNodeBuilder.Type.POM)
133134
.withChildNode(new DependencyNodeBuilder()

0 commit comments

Comments
 (0)