diff --git a/src/main/java/io/spring/gradle/dependencymanagement/internal/ExclusionConfiguringAction.java b/src/main/java/io/spring/gradle/dependencymanagement/internal/ExclusionConfiguringAction.java index 36ae78e..9c4718f 100644 --- a/src/main/java/io/spring/gradle/dependencymanagement/internal/ExclusionConfiguringAction.java +++ b/src/main/java/io/spring/gradle/dependencymanagement/internal/ExclusionConfiguringAction.java @@ -27,6 +27,8 @@ import io.spring.gradle.dependencymanagement.internal.DependencyManagementConfigurationContainer.ConfigurationConfigurer; import org.gradle.api.Action; import org.gradle.api.artifacts.Configuration; +import org.gradle.api.artifacts.Dependency; +import org.gradle.api.artifacts.DependencyConstraintSet; import org.gradle.api.artifacts.DependencySet; import org.gradle.api.artifacts.ModuleDependency; import org.gradle.api.artifacts.ResolvableDependencies; @@ -106,10 +108,7 @@ private void applyMavenExclusions(ResolvableDependencies resolvableDependencies) } private Set findExcludedDependencies() { - DependencySet allDependencies = this.configuration.getAllDependencies(); - Configuration configurationCopy = this.configurationContainer.newConfiguration(this.configurationConfigurer, - allDependencies.toArray(new org.gradle.api.artifacts.Dependency[allDependencies.size()])); - ResolutionResult resolutionResult = configurationCopy.getIncoming().getResolutionResult(); + ResolutionResult resolutionResult = copyConfiguration().getIncoming().getResolutionResult(); ResolvedComponentResult root = resolutionResult.getRoot(); final Set excludedDependencies = new HashSet(); resolutionResult.allDependencies(new Action() { @@ -136,6 +135,20 @@ else if (dependencyResult instanceof UnresolvedDependencyResult) { return excludedDependencies; } + private Configuration copyConfiguration() { + DependencySet allDependencies = this.configuration.getAllDependencies(); + Configuration configurationCopy = this.configurationContainer.newConfiguration(this.configurationConfigurer, + allDependencies.toArray(new Dependency[allDependencies.size()])); + try { + DependencyConstraintSet constraints = this.configuration.getAllDependencyConstraints(); + configurationCopy.getDependencyConstraints().addAll(constraints); + } + catch (NoSuchMethodError ex) { + // Continue + } + return configurationCopy; + } + private Set determineIncludedComponents(ResolvedComponentResult root, Map pomExclusionsById) { LinkedList queue = new LinkedList(); diff --git a/src/test/java/io/spring/gradle/dependencymanagement/DependencyManagementPluginIntegrationTests.java b/src/test/java/io/spring/gradle/dependencymanagement/DependencyManagementPluginIntegrationTests.java index f138d35..eef1dfa 100644 --- a/src/test/java/io/spring/gradle/dependencymanagement/DependencyManagementPluginIntegrationTests.java +++ b/src/test/java/io/spring/gradle/dependencymanagement/DependencyManagementPluginIntegrationTests.java @@ -462,6 +462,13 @@ void exclusionThatIsMalformedIsTolerated() { "commons-logging-1.1.3.jar"); } + @Test + void exclusionsAreAppliedToDependenciesVersionedWithConstraints() { + this.gradleBuild.runner().withArguments("resolve").build(); + assertThat(readLines("resolved.txt")).containsOnly("transitive-exclude-1.0.jar", + "spring-beans-4.1.2.RELEASE.jar", "spring-tx-4.1.2.RELEASE.jar", "spring-core-4.1.2.RELEASE.jar"); + } + private void writeLines(Path path, String... lines) { try { Path resolvedPath = this.gradleBuild.runner().getProjectDir().toPath().resolve(path); diff --git a/src/test/resources/io/spring/gradle/dependencymanagement/DMPIT/exclusionsAreAppliedToDependenciesVersionedWithConstraints.gradle b/src/test/resources/io/spring/gradle/dependencymanagement/DMPIT/exclusionsAreAppliedToDependenciesVersionedWithConstraints.gradle new file mode 100644 index 0000000..291a1f9 --- /dev/null +++ b/src/test/resources/io/spring/gradle/dependencymanagement/DMPIT/exclusionsAreAppliedToDependenciesVersionedWithConstraints.gradle @@ -0,0 +1,27 @@ +plugins { + id "io.spring.dependency-management" + id "java" +} + +repositories { + mavenCentral() + maven { + url file("maven-repo") + } +} + +dependencies { + implementation 'test:transitive-exclude' + constraints { + implementation 'test:transitive-exclude:1.0' + } +} + +task resolve { + doFirst { + def files = project.configurations.compileClasspath.resolve() + def output = new File("${buildDir}/resolved.txt") + output.parentFile.mkdirs() + files.collect { it.name }.each { output << "${it}\n" } + } +}