diff --git a/core/shared/src/main/scala/coursier/maven/MavenRepository.scala b/core/shared/src/main/scala/coursier/maven/MavenRepository.scala index dc3267a74..9cdf9982e 100644 --- a/core/shared/src/main/scala/coursier/maven/MavenRepository.scala +++ b/core/shared/src/main/scala/coursier/maven/MavenRepository.scala @@ -48,7 +48,12 @@ object MavenRepository { val defaultPackaging = "jar" def defaultPublications(moduleName: String, packaging: String) = Seq( - "compile" -> Publication(moduleName, packaging, MavenSource.typeExtension(packaging), ""), + "compile" -> Publication( + moduleName, + packaging, + MavenSource.typeExtension(packaging), + MavenSource.typeDefaultClassifier(packaging) + ), "docs" -> Publication(moduleName, "doc", "jar", "javadoc"), "sources" -> Publication(moduleName, "src", "jar", "sources") ) diff --git a/core/shared/src/main/scala/coursier/maven/MavenSource.scala b/core/shared/src/main/scala/coursier/maven/MavenSource.scala index 4a020eaed..fd3c60145 100644 --- a/core/shared/src/main/scala/coursier/maven/MavenSource.scala +++ b/core/shared/src/main/scala/coursier/maven/MavenSource.scala @@ -136,12 +136,20 @@ case class MavenSource( if (publications.isEmpty) { val type0 = if (dependency.attributes.`type`.isEmpty) "jar" else dependency.attributes.`type` + val extension = MavenSource.typeExtension(type0) + + val classifier = + if (dependency.attributes.classifier.isEmpty) + MavenSource.typeDefaultClassifier(type0) + else + dependency.attributes.classifier + Seq( Publication( dependency.module.name, type0, - MavenSource.typeExtension(type0), - dependency.attributes.classifier + extension, + classifier ) ) } else @@ -163,10 +171,27 @@ object MavenSource { "jar" -> "jar", "bundle" -> "jar", "doc" -> "jar", - "src" -> "jar" + "src" -> "jar", + "test-jar" -> "jar", + "ejb-client" -> "jar" ) def typeExtension(`type`: String): String = typeExtensions.getOrElse(`type`, `type`) + // see https://github.com/apache/maven/blob/c023e58104b71e27def0caa034d39ab0fa0373b6/maven-core/src/main/resources/META-INF/plexus/artifact-handlers.xml + // discussed in https://github.com/alexarchambault/coursier/issues/298 + val typeDefaultClassifiers: Map[String, String] = Map( + "test-jar" -> "tests", + "javadoc" -> "javadoc", + "java-source" -> "sources", + "ejb-client" -> "client" + ) + + def typeDefaultClassifierOpt(`type`: String): Option[String] = + typeDefaultClassifiers.get(`type`) + + def typeDefaultClassifier(`type`: String): String = + typeDefaultClassifierOpt(`type`).getOrElse("") + } \ No newline at end of file diff --git a/plugin/src/main/scala-2.10/coursier/ToSbt.scala b/plugin/src/main/scala-2.10/coursier/ToSbt.scala index df6e4ebc9..b29eb8156 100644 --- a/plugin/src/main/scala-2.10/coursier/ToSbt.scala +++ b/plugin/src/main/scala-2.10/coursier/ToSbt.scala @@ -23,7 +23,9 @@ object ToSbt { // FIXME Get these two from publications artifact.attributes.`type`, MavenSource.typeExtension(artifact.attributes.`type`), - Some(artifact.attributes.classifier).filter(_.nonEmpty), + Some(artifact.attributes.classifier) + .filter(_.nonEmpty) + .orElse(MavenSource.typeDefaultClassifierOpt(artifact.attributes.`type`)), Nil, Some(url(artifact.url)), Map.empty diff --git a/plugin/src/sbt-test/sbt-coursier/hadoop-yarn-server-resourcemanager/build.sbt b/plugin/src/sbt-test/sbt-coursier/hadoop-yarn-server-resourcemanager/build.sbt new file mode 100644 index 000000000..c7c7eda96 --- /dev/null +++ b/plugin/src/sbt-test/sbt-coursier/hadoop-yarn-server-resourcemanager/build.sbt @@ -0,0 +1,10 @@ +scalaVersion := "2.11.8" + +libraryDependencies += "org.apache.hadoop" % "hadoop-yarn-server-resourcemanager" % "2.7.1" + +coursierCachePolicies := { + if (sys.props("os.name").startsWith("Windows")) + coursierCachePolicies.value + else + Seq(coursier.CachePolicy.ForceDownload) +} diff --git a/plugin/src/sbt-test/sbt-coursier/hadoop-yarn-server-resourcemanager/project/plugins.sbt b/plugin/src/sbt-test/sbt-coursier/hadoop-yarn-server-resourcemanager/project/plugins.sbt new file mode 100644 index 000000000..152225a9e --- /dev/null +++ b/plugin/src/sbt-test/sbt-coursier/hadoop-yarn-server-resourcemanager/project/plugins.sbt @@ -0,0 +1,11 @@ +{ + val pluginVersion = sys.props.getOrElse( + "plugin.version", + throw new RuntimeException( + """|The system property 'plugin.version' is not defined. + |Specify this property using the scriptedLaunchOpts -D.""".stripMargin + ) + ) + + addSbtPlugin("io.get-coursier" % "sbt-coursier" % pluginVersion) +} diff --git a/plugin/src/sbt-test/sbt-coursier/hadoop-yarn-server-resourcemanager/src/main/scala/Main.scala b/plugin/src/sbt-test/sbt-coursier/hadoop-yarn-server-resourcemanager/src/main/scala/Main.scala new file mode 100644 index 000000000..032874759 --- /dev/null +++ b/plugin/src/sbt-test/sbt-coursier/hadoop-yarn-server-resourcemanager/src/main/scala/Main.scala @@ -0,0 +1,8 @@ +import java.io.File +import java.nio.file.Files + +import org.apache.zookeeper.ZooKeeper + +object Main extends App { + Files.write(new File("output").toPath, classOf[ZooKeeper].getSimpleName.getBytes("UTF-8")) +} diff --git a/plugin/src/sbt-test/sbt-coursier/hadoop-yarn-server-resourcemanager/test b/plugin/src/sbt-test/sbt-coursier/hadoop-yarn-server-resourcemanager/test new file mode 100644 index 000000000..2182f57b0 --- /dev/null +++ b/plugin/src/sbt-test/sbt-coursier/hadoop-yarn-server-resourcemanager/test @@ -0,0 +1,3 @@ +$ delete output +> run +$ exists output diff --git a/tests/shared/src/test/scala/coursier/test/CentralTests.scala b/tests/shared/src/test/scala/coursier/test/CentralTests.scala index 22c300ed2..afab031d7 100644 --- a/tests/shared/src/test/scala/coursier/test/CentralTests.scala +++ b/tests/shared/src/test/scala/coursier/test/CentralTests.scala @@ -355,6 +355,42 @@ object CentralTests extends TestSuite { assert(nonUnique.isEmpty) } } + + 'testJarType - { + // dependencies with type "test-jar" should be given the classifier "tests" by default + + async { + val deps = Set( + Dependency( + Module("org.apache.hadoop", "hadoop-yarn-server-resourcemanager"), + "2.7.1" + ) + ) + + val res = await(resolve(deps)) + + assert(res.errors.isEmpty) + assert(res.conflicts.isEmpty) + assert(res.isDone) + + val dependencyArtifacts = res.dependencyArtifacts + + val zookeeperTestArtifacts = dependencyArtifacts.collect { + case (dep, artifact) + if dep.module == Module("org.apache.zookeeper", "zookeeper") && + dep.attributes.`type` == "test-jar" => + artifact + } + + assert(zookeeperTestArtifacts.length == 1) + + val zookeeperTestArtifact = zookeeperTestArtifacts.head + + assert(zookeeperTestArtifact.attributes.`type` == "test-jar") + assert(zookeeperTestArtifact.attributes.classifier == "tests") + zookeeperTestArtifact.url.endsWith("-tests.jar") + } + } } }