diff --git a/core/shared/src/main/scala/coursier/maven/MavenRepository.scala b/core/shared/src/main/scala/coursier/maven/MavenRepository.scala index f19e05a22..d20fdb7c4 100644 --- a/core/shared/src/main/scala/coursier/maven/MavenRepository.scala +++ b/core/shared/src/main/scala/coursier/maven/MavenRepository.scala @@ -249,7 +249,7 @@ final case class MavenRepository( for { xml <- \/.fromEither(compatibility.xmlParse(str)) _ <- if (xml.label == "project") \/-(()) else -\/("Project definition not found") - proj <- Pom.project(xml) + proj <- Pom.project(xml, relocationAsDependency = true) } yield proj def artifactFor(url: String) = diff --git a/core/shared/src/main/scala/coursier/maven/Pom.scala b/core/shared/src/main/scala/coursier/maven/Pom.scala index 2d1520347..9b0f43ca3 100644 --- a/core/shared/src/main/scala/coursier/maven/Pom.scala +++ b/core/shared/src/main/scala/coursier/maven/Pom.scala @@ -140,7 +140,13 @@ object Pom { def packagingOpt(pom: Node): Option[String] = text(pom, "packaging", "").toOption - def project(pom: Node): String \/ Project = { + def project(pom: Node): String \/ Project = + project(pom, relocationAsDependency = false) + + def project( + pom: Node, + relocationAsDependency: Boolean + ): String \/ Project = { import Scalaz._ for { @@ -242,10 +248,41 @@ object Pom { case \/-(d) => d } + val finalProjModule = projModule.copy(organization = groupId) + + val relocationDependencyOpt = + if (relocationAsDependency) + pom.children + .find(_.label == "distributionManagement") + .flatMap(_.children.find(_.label == "relocation")) + .map { n => + + // see https://maven.apache.org/guides/mini/guide-relocation.html + + val relocatedGroupId = text(n, "groupId", "").getOrElse(finalProjModule.organization) + val relocatedArtifactId = text(n, "artifactId", "").getOrElse(finalProjModule.name) + val relocatedVersion = text(n, "version", "").getOrElse(version) + + "" -> Dependency( + finalProjModule.copy( + organization = relocatedGroupId, + name = relocatedArtifactId + ), + relocatedVersion, + "", + Set(), + Attributes("", ""), + optional = false, + transitive = true + ) + } + else + None + Project( - projModule.copy(organization = groupId), + finalProjModule, version, - deps.map { + (relocationDependencyOpt.toList ::: deps).map { case (config, dep0) => val dep = extraAttrsMap.get(dep0.moduleVersion).fold(dep0)(attrs => dep0.copy(module = dep0.module.copy(attributes = attrs)) diff --git a/tests/shared/src/test/resources/resolutions/bouncycastle/bctsp-jdk14/138 b/tests/shared/src/test/resources/resolutions/bouncycastle/bctsp-jdk14/138 new file mode 100644 index 000000000..710c52165 --- /dev/null +++ b/tests/shared/src/test/resources/resolutions/bouncycastle/bctsp-jdk14/138 @@ -0,0 +1,4 @@ +bouncycastle:bctsp-jdk14:138:compile +org.bouncycastle:bcmail-jdk14:1.38:compile +org.bouncycastle:bcprov-jdk14:1.38:compile +org.bouncycastle:bctsp-jdk14:1.38:compile diff --git a/tests/shared/src/test/scala/coursier/test/CentralTests.scala b/tests/shared/src/test/scala/coursier/test/CentralTests.scala index ef222e65a..8dceeb69d 100644 --- a/tests/shared/src/test/scala/coursier/test/CentralTests.scala +++ b/tests/shared/src/test/scala/coursier/test/CentralTests.scala @@ -586,6 +586,13 @@ object CentralTests extends TestSuite { "0.9.19" ) } + + 'relocation - { + resolutionCheck( + Module("bouncycastle", "bctsp-jdk14"), + "138" + ) + } } }