【问题标题】:How to force a specific version of dependency?如何强制特定版本的依赖项?
【发布时间】:2016-07-29 19:41:43
【问题描述】:

一个依赖bar 依赖于foo 1.2.3,但那个版本的foo 有一个错误,我需要使用版本1.2.2。

我可以通过 force() 做到这一点。

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

docs 不推荐这种方法:

强制修改(不推荐)

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

这是否意味着 SBT 有一种不同于 force() 的更好的方式来使用特定版本的依赖项?如果有,是什么?

或者我是否应该从文档中推断出这整个问题是我建议不要遇到的问题?

【问题讨论】:

    标签: sbt


    【解决方案1】:

    你可以使用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"
    

    【讨论】:

    • 别忘了最后的这个尖嘴Note: this is an Ivy-only feature and will not be included in a published pom.xml.
    • 试试libraryDependencies := Set()
    • dependencyOverrides ++= Set(... foo ...)
    • 如果这对任何人都不起作用,请尝试添加 dependencyOverrides += "...foo.. " 就像这样:stackoverflow.com/a/37966356/7082628
    • @EugenePlatonov,没关系。它会与多个覆盖混淆;我只需要一个逃生舱口。
    猜你喜欢
    • 2017-04-14
    • 1970-01-01
    • 1970-01-01
    • 2018-06-29
    • 2016-06-02
    • 1970-01-01
    • 2018-03-04
    • 2019-04-18
    • 2020-11-25
    相关资源
    最近更新 更多