是否有maven依赖:在sbt中获得模拟?

时间:2014-12-05 08:54:23

标签: java scala maven dependencies sbt

如何使用sbt下载依赖项?对于maven,它是:

mvn dependency:get

sbt中有模拟吗?

2 个答案:

答案 0 :(得分:0)

不幸的是,没有单个sbt命令可用于此目的。但是,sbt提供了一个dependencyResolution任务密钥,可用于实现custom task从存储库中下载单个jar。

这是一个示例实现(将其添加到build.sbt中):

lazy val downloadArtifact = taskKey[Unit]("Download an artifact")
downloadArtifact := {
  val module = "com.typesafe.scala-logging" %% "scala-logging" % "3.9.2"
  val dr = dependencyResolution.value
  val files = dr.retrieve(
    dr.wrapDependencyInModule(module exclude("*", "*")),
    retrieveDirectory = new File("target"),
    log = (streams in Compile).value.log
  ).fold(e => throw e.resolveException, identity(_))
  println(files)
}

注意事项:

  • 默认情况下,最新的sbt版本使用coursier来解决依赖项,并且coursier有一个错误,它忽略了retrieveDirectory参数(请参见https://github.com/sbt/sbt/issues/5465)。这意味着即使API假定下载的文件也不会放入retrieveDirectory中。您可以禁用coursier并改用常春藤(useCoursier := false),也可以将文件自己复制到所需的目的地(上面的files值为下载文件的List[java.io.File]

注意:

  • DependencyResolution.retrieve下载工件及其所有依赖项。这就是为什么在上面添加exclude("*", "*")的原因-仅下载工件本身并排除其所有依赖项。

  • 即使您检索单个依赖项,使用coursier时,此函数也可能会生成多个文件位置的列表(我认为这是由于依赖项解析逻辑的特殊性)。您可以使用列表中的任何文件,因为通常它们都指向同一文件。

  • 由于此实现使用sbt的dependencyResolution,因此它尊重您可能在sbt项目中声明的所有自定义解析器(自定义存储库)。


最后,尽管它没有与sbt集成在一起,但是也许值得一提的是,如果您恰好安装了coursier,则可以使用coursier fetch

cs fetch com.typesafe.scala-logging::scala-logging:3.9.2

答案 1 :(得分:-1)

除非我误解the documentation of mvn dependency:get,否则sbt中的等价物是

> update

请参阅Dependency Management Flow