强制特定版本的SBT依赖项的推荐方法

时间:2016-04-08 13:50:41

标签: dependencies sbt ivy

依赖项bar取决于foo 1.2.3,但该foo版本有错误,我需要使用版本1.2.2。

我可以使用force()

libraryDependencies += "foo" %% "foo" % "1.2.2" force()

docs

不推荐使用该方法
  

强制修改(不推荐)

     

注意:强制可能会造成逻辑上的不一致,因此不再推荐使用。

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

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

1 个答案:

答案 0 :(得分:36)

您可以使用dependencyOverrides

dependencyOverrides += "foo" %% "foo" % "1.2.2"

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

来自文档:

  

覆盖版本

     

对于二进制兼容的冲突,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" ) 
     

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

show update 
[info] compile: 
[info]    log4j:log4j:1.2.17: ... ... 
[info]    (EVICTED) log4j:log4j:1.2.16 ... 
     

更改版本   选中,添加覆盖:

dependencyOverrides += "log4j" % "log4j" % "1.2.16"