Skip to content

Commit 5be22d6

Browse files
committed
Consider constraints when copy configuration to determine exclusions
Closes gh-340
1 parent 1a869a8 commit 5be22d6

File tree

3 files changed

+51
-4
lines changed

3 files changed

+51
-4
lines changed

src/main/java/io/spring/gradle/dependencymanagement/internal/ExclusionConfiguringAction.java

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@
2727
import io.spring.gradle.dependencymanagement.internal.DependencyManagementConfigurationContainer.ConfigurationConfigurer;
2828
import org.gradle.api.Action;
2929
import org.gradle.api.artifacts.Configuration;
30+
import org.gradle.api.artifacts.Dependency;
31+
import org.gradle.api.artifacts.DependencyConstraintSet;
3032
import org.gradle.api.artifacts.DependencySet;
3133
import org.gradle.api.artifacts.ModuleDependency;
3234
import org.gradle.api.artifacts.ResolvableDependencies;
@@ -106,10 +108,7 @@ private void applyMavenExclusions(ResolvableDependencies resolvableDependencies)
106108
}
107109

108110
private Set<DependencyCandidate> findExcludedDependencies() {
109-
DependencySet allDependencies = this.configuration.getAllDependencies();
110-
Configuration configurationCopy = this.configurationContainer.newConfiguration(this.configurationConfigurer,
111-
allDependencies.toArray(new org.gradle.api.artifacts.Dependency[allDependencies.size()]));
112-
ResolutionResult resolutionResult = configurationCopy.getIncoming().getResolutionResult();
111+
ResolutionResult resolutionResult = copyConfiguration().getIncoming().getResolutionResult();
113112
ResolvedComponentResult root = resolutionResult.getRoot();
114113
final Set<DependencyCandidate> excludedDependencies = new HashSet<DependencyCandidate>();
115114
resolutionResult.allDependencies(new Action<DependencyResult>() {
@@ -136,6 +135,20 @@ else if (dependencyResult instanceof UnresolvedDependencyResult) {
136135
return excludedDependencies;
137136
}
138137

138+
private Configuration copyConfiguration() {
139+
DependencySet allDependencies = this.configuration.getAllDependencies();
140+
Configuration configurationCopy = this.configurationContainer.newConfiguration(this.configurationConfigurer,
141+
allDependencies.toArray(new Dependency[allDependencies.size()]));
142+
try {
143+
DependencyConstraintSet constraints = this.configuration.getAllDependencyConstraints();
144+
configurationCopy.getDependencyConstraints().addAll(constraints);
145+
}
146+
catch (NoSuchMethodError ex) {
147+
// Continue
148+
}
149+
return configurationCopy;
150+
}
151+
139152
private Set<DependencyCandidate> determineIncludedComponents(ResolvedComponentResult root,
140153
Map<String, Exclusions> pomExclusionsById) {
141154
LinkedList<Node> queue = new LinkedList<Node>();

src/test/java/io/spring/gradle/dependencymanagement/DependencyManagementPluginIntegrationTests.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -462,6 +462,13 @@ void exclusionThatIsMalformedIsTolerated() {
462462
"commons-logging-1.1.3.jar");
463463
}
464464

465+
@Test
466+
void exclusionsAreAppliedToDependenciesVersionedWithConstraints() {
467+
this.gradleBuild.runner().withArguments("resolve").build();
468+
assertThat(readLines("resolved.txt")).containsOnly("transitive-exclude-1.0.jar",
469+
"spring-beans-4.1.2.RELEASE.jar", "spring-tx-4.1.2.RELEASE.jar", "spring-core-4.1.2.RELEASE.jar");
470+
}
471+
465472
private void writeLines(Path path, String... lines) {
466473
try {
467474
Path resolvedPath = this.gradleBuild.runner().getProjectDir().toPath().resolve(path);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
plugins {
2+
id "io.spring.dependency-management"
3+
id "java"
4+
}
5+
6+
repositories {
7+
mavenCentral()
8+
maven {
9+
url file("maven-repo")
10+
}
11+
}
12+
13+
dependencies {
14+
implementation 'test:transitive-exclude'
15+
constraints {
16+
implementation 'test:transitive-exclude:1.0'
17+
}
18+
}
19+
20+
task resolve {
21+
doFirst {
22+
def files = project.configurations.compileClasspath.resolve()
23+
def output = new File("${buildDir}/resolved.txt")
24+
output.parentFile.mkdirs()
25+
files.collect { it.name }.each { output << "${it}\n" }
26+
}
27+
}

0 commit comments

Comments
 (0)