【问题标题】:How to solve transitive dependencies version conflicts (scala/sbt)如何解决传递依赖版本冲突(scala/sbt)
【发布时间】:2016-02-26 00:54:43
【问题描述】:

我有一个包含多个实用程序类的项目。让我们将其命名为Utils。 我有一个proj1,它取决于Utils。另一个proj2 依赖于proj1Utils

问题是如果proj1proj2 都依赖于不同的Utils 版本,这将导致问题。

什么是最好的解决方案?

这种情况发生在Scala/SBT项目中,但我猜其他语言也有同样的问题。

编辑:

需要明确的是,proj2 是要运行的项目,它使用来自 proj1Utils 的一些代码。

【问题讨论】:

  • 确实没有最好的解决方案。只是解决方法和很大的希望。在某些时候,您将不得不选择一个版本的 Utils。如果它是较新的版本,您最好希望它向后兼容。如果它是旧版本,你最好希望你的库没有使用任何尚不存在的方法。无论哪种方式,交叉手指尝试一下,这是我能想到的唯一解决方案(当然,如果更新项目以使用相同版本的 Utils 是不可能的)。
  • utils 是另一个子项目还是可以拆分出来单独发布? sbt-assembly 项目has support for shading,因此您可以通过更改旧依赖项的名称来处理冲突。
  • @SeanVieira 他们是 3 个不同的项目。不涉及子项目

标签: scala maven dependencies sbt transitive-dependency


【解决方案1】:

这是经典的Jar Hell,它是任何基于 JVM 的项目的问题,而不仅仅是 scala 和 sbt。

常见的解决方法有4种

  1. 通过更改代码消除冲突,将您的多个版本依赖项合并为一个依赖项。

  2. 阴影(如上面@Sean Viera 所述)

  3. 多个 ClassLoader 组件架构,如 OSGI(@tuxdna 提到)

  4. 像微服务架构一样在单独的 JVM 中运行(@tuxdna 也提到过)

【讨论】:

    【解决方案2】:

    你有三个不同的项目:

    • 实用程序
    • proj1
    • proj2

    您可以100% 确保 proj1 和 proj2 之间没有冲突的唯一方法是单独运行它们。

    一旦你将 proj1 和 proj2 与不同版本的 Utils 混合在同一个类路径上,你最终会覆盖一个或另一个项目。

    您可以使用以下方法实现隔离:

    • 使用适当版本的 Utils 在单独的 JVM 中运行它们
    • 在同一个 JVM 但在不同的类加载器中运行它们

    【讨论】:

      猜你喜欢
      • 2017-09-10
      • 2018-11-01
      • 1970-01-01
      • 2013-06-04
      • 2016-07-18
      • 1970-01-01
      • 2013-10-19
      • 2020-10-02
      • 2015-10-12
      相关资源
      最近更新 更多