建议的方法强制特定版本的SBT依赖项

Pau*_*per 21 dependencies ivy sbt

依赖性bar取决于foo1.2.3,但该版本foo有一个错误,我需要使用版本1.2.2.

我可以这样做force().

libraryDependencies += "foo" %% "foo" % "1.2.2" force()
Run Code Online (Sandbox Code Playgroud)

文档不建议使用该方法:

强制修改(不推荐)

注意:强制可能会产生逻辑不一致,因此不再推荐使用它.

这是否意味着SBT force()与使用特定版本的依赖关系有不同的更好的方法?如果是这样,什么?

或者我是否从文档中推断出整个问题是我建议不要有的问题?

Gio*_*tti 38

你可以使用dependencyOverrides:

dependencyOverrides += "foo" %% "foo" % "1.2.2"
Run Code Online (Sandbox Code Playgroud)

无论如何,你并没有避免"逻辑上的不一致".如果你强制使用一个版本,你必须手动处理与其他库的兼容性,没有办法解决这个问题.

从文档:

覆盖版本

对于二进制兼容冲突,sbt提供依赖性覆盖.它们使用dependencyOverrides设置进行配置,该设置是一组ModuleID.例如,以下依赖项定义冲突,因为spark使用log4j 1.2.16而scalaxb使用log4j 1.2.17:

libraryDependencies ++= Seq(
  "org.spark-project" %% "spark-core" % "0.5.1",    
  "org.scalaxb" %% "scalaxb" % "1.0.0" ) 
Run Code Online (Sandbox Code Playgroud)

默认冲突管理器选择log4j的最新版本1.2.17:

show update 
[info] compile: 
[info]    log4j:log4j:1.2.17: ... ... 
[info]    (EVICTED) log4j:log4j:1.2.16 ... 
Run Code Online (Sandbox Code Playgroud)

要更改所选版本,请添加覆盖:

dependencyOverrides += "log4j" % "log4j" % "1.2.16"
Run Code Online (Sandbox Code Playgroud)

  • `dependencyOverrides ++ = Set(... foo ...)` (4认同)
  • 不要忘记最后的这句话"``注意:这是一个仅限Ivy的功能,不会包含在已发布的pom.xml中.`` (2认同)