diff --git a/platforms/software/maven/src/integTest/groovy/org/gradle/api/publish/maven/MavenPublishResolvedVersionsJavaIntegTest.groovy b/platforms/software/maven/src/integTest/groovy/org/gradle/api/publish/maven/MavenPublishResolvedVersionsJavaIntegTest.groovy index 878e13144785..733b5e6e5476 100644 --- a/platforms/software/maven/src/integTest/groovy/org/gradle/api/publish/maven/MavenPublishResolvedVersionsJavaIntegTest.groovy +++ b/platforms/software/maven/src/integTest/groovy/org/gradle/api/publish/maven/MavenPublishResolvedVersionsJavaIntegTest.groovy @@ -546,6 +546,61 @@ class MavenPublishResolvedVersionsJavaIntegTest extends MavenPublishResolvedVers } } + @Issue("https://github.com/gradle/gradle/issues/28225") + def "maps version of dependency with artifact"() { + given: + mavenRepo.module("org", "foo", "2.1").artifact(classifier: "cls").publish() + + settingsFile << "rootProject.name = 'producer'" + buildFile << """ + plugins { + id("java-library") + id("maven-publish") + } + + ${mavenTestRepository()} + + group = "org.example" + version = "1.0" + + dependencies { + implementation "org:foo:2.+:cls" + } + + publishing { + publications { + mavenJava(MavenPublication) { + from components.java + versionMapping { + usage('java-api') { + fromResolutionOf('runtimeClasspath') + } + usage('java-runtime') { + fromResolutionResult() + } + } + } + } + ${mavenTestRepository()} + } + """ + + when: + succeeds("publish") + + then: + def pom = mavenRepo.module("org.example", "producer", "1.0").parsedPom + + def dependencies = pom.scopes.runtime.dependencies.values() + dependencies.size() == 1 + + def dependency = dependencies[0] + dependency.groupId == "org" + dependency.artifactId == "foo" + dependency.version == "2.1" + dependency.classifier == "cls" + } + } class MavenPublishJavaLibraryRuntimeLastResolvedVersionsJavaIntegTest extends MavenPublishResolvedVersionsJavaFixture { diff --git a/platforms/software/maven/src/main/java/org/gradle/api/publish/maven/internal/publication/MavenComponentParser.java b/platforms/software/maven/src/main/java/org/gradle/api/publish/maven/internal/publication/MavenComponentParser.java index 996939afdb29..ca4f55f39942 100644 --- a/platforms/software/maven/src/main/java/org/gradle/api/publish/maven/internal/publication/MavenComponentParser.java +++ b/platforms/software/maven/src/main/java/org/gradle/api/publish/maven/internal/publication/MavenComponentParser.java @@ -320,15 +320,15 @@ private void convertDependency(ModuleDependency dependency, Consumer allExcludeRules = getExcludeRules(globalExcludes, dependency); if (dependency.getArtifacts().isEmpty()) { - ResolvedCoordinates coordinates = resolveDependency(dependency); + ResolvedCoordinates coordinates = resolveDependency(dependency, true); collector.accept(newDependency(coordinates, null, null, scope, allExcludeRules, optional)); return; } - // If the dependency has artifacts, do not map the coordinates. + // If the dependency has artifacts, only map the coordinates to component-level precision. // This is so we match the Gradle behavior where an explicit artifact on a dependency // that would otherwise map to different coordinates resolves to the declared coordinates. - ResolvedCoordinates coordinates = convertDeclaredCoordinates(dependency.getGroup(), dependency.getName(), dependency.getVersion()); + ResolvedCoordinates coordinates = resolveDependency(dependency, false); for (DependencyArtifact artifact : dependency.getArtifacts()) { ResolvedCoordinates artifactCoordinates = coordinates; if (!artifact.getName().equals(dependency.getName())) { @@ -375,15 +375,22 @@ private void convertDependencyConstraint(DependencyConstraint dependency, Consum } private void convertImportDependencyConstraint(ModuleDependency dependency, Consumer collector) { - ResolvedCoordinates identifier = resolveDependency(dependency); + ResolvedCoordinates identifier = resolveDependency(dependency, true); collector.accept(newDependency(identifier, "pom", null, "import", Collections.emptySet(), false)); } - private ResolvedCoordinates resolveDependency(ModuleDependency dependency) { + private ResolvedCoordinates resolveDependency(ModuleDependency dependency, boolean variantPrecision) { if (dependency instanceof ProjectDependency) { return variantDependencyResolver.resolveVariantCoordinates((ProjectDependency) dependency, warnings); } else if (dependency instanceof ExternalDependency) { - ResolvedCoordinates identifier = variantDependencyResolver.resolveVariantCoordinates((ExternalDependency) dependency, warnings); + + ResolvedCoordinates identifier; + if (variantPrecision) { + identifier = variantDependencyResolver.resolveVariantCoordinates((ExternalDependency) dependency, warnings); + } else { + identifier = componentDependencyResolver.resolveComponentCoordinates((ExternalDependency) dependency); + } + if (identifier != null) { return identifier; }