【问题标题】:How to resolve dependency conflict of an SBT dependency?如何解决 SBT 依赖项的依赖项冲突?
【发布时间】:2016-07-18 05:58:14
【问题描述】:

我有一个项目的 build.sbt 正在使用:

libraryDependencies ++= Seq(
   "com.lerestau" % "killer-launcher" % "1.0.2",
   "com.lerestau" % "menu-starter" % "1.0.0"
)

menu-starter 传递下载 "killer-launcher" % "0.0.8" 并因此在当前项目中出现错误。有什么办法可以解决这种冲突。我想出了 dependencyOverrides,但如果冲突完全是二元的,那么它会起作用。那没有用。 SBT中如何解决?

【问题讨论】:

    标签: dependencies sbt


    【解决方案1】:

    以下内容应该摆脱 menu-starter 对旧版本的杀手启动器的传递依赖:

    libraryDependencies ++= Seq(
      "com.lerestau" % "killer-launcher" % "1.0.2",
      "com.lerestau" % "menu-starter" % "1.0.0" exclude("com.lerestau", "killer-launcher"
    )  
    

    更多详情可以在the documentation 中找到,遗憾的是似乎没有办法直接链接到相关部分。

    【讨论】:

    • 我使用的是在新版本中定义的class,即 1.0.2 但它在旧版本 (0.0.8) 中不存在。如果我exclude("com.lerestau","killer-launcher"),它会抛出NoClassDefFoundError,就像我的情况一样。
    • menu-starter 仅包含 0.8 版,因此排除它不会产生影响,除非 menu-starter 依赖于仅在 0.8 中可用的接口
    • 根据我对您所说的“排除一个不应该对 我的项目 产生影响”的理解,这对于编译是正确的。但是在构建时,当我尝试运行它时,得到这个“NoClassDefFoundError”指向com/lerestau/killer-launcher/Launcher$NewLauncher。 NewLauncher 存在于版本 1.0.2 但不存在于 0.0.8。
    • Sbt 默认会选择最后一个版本。在这不起作用的情况下(发生在我们身上的例子:在库中包含 slf4j-classic 的人)摆脱“坏”依赖应该解决它。但是,如果两者都对各自的版本有硬依赖,并且这些版本从根本上不兼容,那么我看不出任何工具(无论是 Sbt、Maven、Gradle 还是您拥有的工具)如何合理地解决此冲突。也许dependency graph 会提供清晰的信息。
    猜你喜欢
    • 2017-09-10
    • 2016-06-19
    • 2018-11-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-05
    • 2017-11-05
    • 2016-02-26
    • 2019-01-01
    相关资源
    最近更新 更多