From 190e808314a8e6d771249c6b5021906768803c30 Mon Sep 17 00:00:00 2001 From: Bo Zhang Date: Sat, 27 May 2017 10:59:53 +0800 Subject: [PATCH] Ignore artifact when relocation exists in pom This fixes https://github.com/gradle/gradle/issues/1789 When element exists in pom, both original artifact (if it exists) and relocated artifact will be downloaded, which causes package conflict. For example, org.apache.commons:commons-io:1.3.2 is relocated to commons-io:commons-io:1.3.2, if a project depends on org.apache.commons:commons-io:1.3.2 and commons-io:commons-io:2.4, the two artifacts will both exist in resolved classpath. (See MavenPomPackagingResolveIntegrationTest.groovy provided in this commit) This fix checks if relocation exists in pom and ignore its artifact if necessary. This problem is first introduced in Gradle 2.0. An integration test is provide to justify the fix. In addition, an unnecessary artifact retrieval in test and a redundant System.out.println("") is removed. --- .../DefaultBuildOperationExecutor.java | 1 - ...nPomPackagingResolveIntegrationTest.groovy | 23 +++++++++++++++++++ .../MavenPomResolveIntegrationTest.groovy | 1 - .../repositories/resolver/MavenResolver.java | 3 +++ 4 files changed, 26 insertions(+), 2 deletions(-) diff --git a/subprojects/core/src/main/java/org/gradle/internal/progress/DefaultBuildOperationExecutor.java b/subprojects/core/src/main/java/org/gradle/internal/progress/DefaultBuildOperationExecutor.java index c5ce56dabab2..f0fa93b0eb61 100644 --- a/subprojects/core/src/main/java/org/gradle/internal/progress/DefaultBuildOperationExecutor.java +++ b/subprojects/core/src/main/java/org/gradle/internal/progress/DefaultBuildOperationExecutor.java @@ -309,7 +309,6 @@ public String getDisplayName() { @Override public void execute(CallableBuildOperation buildOperation, BuildOperationContext context) { returnValue = buildOperation.call(context); - System.out.print(""); } public T getReturnValue() { diff --git a/subprojects/dependency-management/src/integTest/groovy/org/gradle/integtests/resolve/maven/MavenPomPackagingResolveIntegrationTest.groovy b/subprojects/dependency-management/src/integTest/groovy/org/gradle/integtests/resolve/maven/MavenPomPackagingResolveIntegrationTest.groovy index 6071c596ed09..ca9cff410449 100644 --- a/subprojects/dependency-management/src/integTest/groovy/org/gradle/integtests/resolve/maven/MavenPomPackagingResolveIntegrationTest.groovy +++ b/subprojects/dependency-management/src/integTest/groovy/org/gradle/integtests/resolve/maven/MavenPomPackagingResolveIntegrationTest.groovy @@ -333,4 +333,27 @@ compile('group:projectA:1.0') { succeeds 'retrieve' } + @Issue('https://github.com/gradle/gradle/issues/1789') + def "ignore artifact when relocation is defined in pom"() { + given: + buildFile << """ +repositories { jcenter() } +configurations { compile } +dependencies { + // http://repo1.maven.org/maven2/org/apache/commons/commons-io/1.3.2/commons-io-1.3.2.pom + compile 'org.apache.commons:commons-io:1.3.2' + compile 'commons-io:commons-io:2.4' +} +task retrieve(type: Sync) { + from configurations.compile + into 'libs' +} +""" + when: + run 'retrieve' + + then: + file("libs").assertHasDescendants("commons-io-2.4.jar") + } + } diff --git a/subprojects/dependency-management/src/integTest/groovy/org/gradle/integtests/resolve/maven/MavenPomResolveIntegrationTest.groovy b/subprojects/dependency-management/src/integTest/groovy/org/gradle/integtests/resolve/maven/MavenPomResolveIntegrationTest.groovy index 3490ffe7d1d9..d557be1f206a 100644 --- a/subprojects/dependency-management/src/integTest/groovy/org/gradle/integtests/resolve/maven/MavenPomResolveIntegrationTest.groovy +++ b/subprojects/dependency-management/src/integTest/groovy/org/gradle/integtests/resolve/maven/MavenPomResolveIntegrationTest.groovy @@ -52,7 +52,6 @@ task retrieve(type: Sync) { and: original.pom.expectGet() - original.artifact.expectHead() newModule.pom.expectGet() newModule.artifact.expectGet() diff --git a/subprojects/dependency-management/src/main/java/org/gradle/api/internal/artifacts/repositories/resolver/MavenResolver.java b/subprojects/dependency-management/src/main/java/org/gradle/api/internal/artifacts/repositories/resolver/MavenResolver.java index 074f92732ce7..2f1d75a6fa05 100644 --- a/subprojects/dependency-management/src/main/java/org/gradle/api/internal/artifacts/repositories/resolver/MavenResolver.java +++ b/subprojects/dependency-management/src/main/java/org/gradle/api/internal/artifacts/repositories/resolver/MavenResolver.java @@ -34,6 +34,7 @@ import org.gradle.internal.component.external.model.ModuleComponentArtifactIdentifier; import org.gradle.internal.component.external.model.ModuleComponentArtifactMetadata; import org.gradle.internal.component.external.model.MutableMavenModuleResolveMetadata; +import org.gradle.internal.component.model.ComponentArtifactMetadata; import org.gradle.internal.component.model.ComponentOverrideMetadata; import org.gradle.internal.component.model.DefaultIvyArtifactName; import org.gradle.internal.component.model.IvyArtifactName; @@ -252,6 +253,8 @@ protected void resolveModuleArtifacts(MavenModuleResolveMetadata module, Buildab if (module.isKnownJarPackaging()) { ModuleComponentArtifactMetadata artifact = module.artifact("jar", "jar", null); result.resolved(new FixedComponentArtifacts(ImmutableSet.of(artifact))); + } else if (module.isRelocated()) { + result.resolved(new FixedComponentArtifacts(Collections.emptyList())); } }