【问题标题】:Why is SBT NOT excluding these libraries despite using excludes?尽管使用了排除,为什么 SBT 不排除这些库?
【发布时间】:2014-08-07 23:06:17
【问题描述】:

尽管做了以下操作,sbt 仍然在抓取lift-json。为什么?

"net.liftweb" %% "lift-mapper" % "2.6-M4" % "compile" excludeAll(ExclusionRule("net.liftweb", "lift-json"))

更多信息。这是依赖树显示的内容:

+-net.liftweb:lift-mapper_2.10:2.6-M4
[info]   | +-net.liftweb:lift-db_2.10:2.6-M4
[info]   | | +-net.liftweb:lift-util_2.10:2.6-M4
[info]   | | | | 
…
[info]   | | | |   
[info]   | | | +-net.liftweb:lift-json_2.10:2.6-M4

所以依赖是lift-mapper -> lift-db -> lift-util -> lift-json,可能排斥不深?

【问题讨论】:

    标签: sbt


    【解决方案1】:

    这里不明显的关键是 sbt 中的排除实际上只是底层 Ivy 引擎的传递规则。由于 Ivy 对 sbt 约定一无所知(例如,将 _2.10 附加到特定于 Scala 版本的依赖项),因此您需要告诉它它应该真正排除的内容。在这种情况下,这意味着该行应如下所示:

    "net.liftweb" %% "lift-mapper" % "2.6-M4" % "compile" excludeAll(ExclusionRule("net.liftweb", "lift-json_2.10"))
    

    也许可以对 sbt 进行一些增强,使其能够看到由于您定义的依赖项是 Scala 版本特定的,它还应该尝试为该版本添加排除规则。

    【讨论】:

    • 是的。我也遇到过这个。请问您或@ChanningWalton 可以为它打开一个 Github 问题吗?
    • 可以排除 scala 依赖项而不用硬编码它的 scala 版本: excludeAll(ExclusionRule("net.liftweb", "lift-json").withCrossVersion(CrossVersion.binary))
    【解决方案2】:

    也许还有其他一些库依赖于它。您可以使用 sbt-dependency-graph 插件找到这些库。或者干脆将其从所有依赖项中排除:

    libraryDependencies ++= Seq(
      ......
    ).map(_.excludeAll(ExclusionRule("net.liftweb", "lift-json")))
    

    【讨论】:

    • 我使用依赖图检查,lift-json 的唯一来源是 lift-mapper。
    • 如果从 libraryDependencies 中排除不起作用,请尝试与 allDependencies 相同
    • 非常感谢。这是解决传递依赖问题所必需的!
    猜你喜欢
    • 2017-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-13
    • 2015-08-30
    • 2018-12-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多