java - 是否有maven依赖:get analog in sbt?

标签 java scala maven dependencies sbt

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

mvn dependency:get

sbt中有模拟吗?

最佳答案

不幸的是,没有一个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 )。这意味着下载的文件不会被放入 retrieveDirectory,即使 API 假定如此。您可以禁用 coursier 并改用 ivy (useCoursier := false),或者自己将文件复制到所需的目的地(上面的 files 值是一个 List [java.io.File] 包含下载的文件。

注意事项:

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

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

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


最后,虽然这没有与 sbt 集成,但也许值得一提,如果你碰巧有 coursier安装后可以使用 coursier fetch :

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

关于java - 是否有maven依赖:get analog in sbt?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27312089/

相关文章:

java - 查找特定属性,Selenium Xpath Java

scala - 用于命令行参数的简单解构提取器

maven - 无法更改 Maven 本地存储库路径

java - 安卓 : Could not GET/Find get repos from bintray. com

scala - 使用 Scala 的 Maven 或 SBT?

java - Google oauth java 客户端获取访问 token 失败,出现 "400 Bad Request { "错误” : "invalid_request" }"

java - 消除通过 tcp/ip 发送字符串的延迟

java - 重定向后重做原始请求 getRequestDispatcher

scala - 宏 : path dependent type inference confusion

scala - Spark:ForeachRDD,跳过行引发任务不可序列化(scala闭包)