如何解决传递依赖版本冲突(scala/sbt)

How to solve transitive dependencies version conflicts (scala/sbt)

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

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

最好的解决方案是什么?

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

Edit:

Just to be clear, proj2 is the project that will run, that uses some code from proj1 and Utils.

您有三个不同的项目:

  • 实用程序
  • proj1 <- 取决于 Utils v1
  • proj2 <- 取决于 Utils v2

确保 proj1 和 proj2 之间没有冲突的唯一方法是 100% 将它们 运行 隔离。

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

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

  • 运行 它们在单独的 JVM 中,具有适当版本的 Utils
  • 运行 它们在同一个 JVM 中但在不同的 class 加载器中

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

常见的解有4种

  1. 通过更改代码摆脱冲突,将您的多版本依赖整合为单一依赖。

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

  3. 多类加载器组件架构,如 OSGI(如@tuxdna 所述)

  4. 运行 在单独的 JVM 中,如微服务架构(@tuxdna 也提到)