如何解决传递依赖版本冲突(scala/sbt)
How to solve transitive dependencies version conflicts (scala/sbt)
我有一个包含多个实用程序的项目 类。我们将其命名为Utils
。
我有一个 proj1
,它依赖于 Utils
。另一个 proj2
依赖于 proj1
和 Utils
.
问题是如果 proj1
和 proj2
都依赖于不同的 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种
通过更改代码摆脱冲突,将您的多版本依赖整合为单一依赖。
阴影(如上@Sean Viera 所述)
多类加载器组件架构,如 OSGI(如@tuxdna 所述)
运行 在单独的 JVM 中,如微服务架构(@tuxdna 也提到)
我有一个包含多个实用程序的项目 类。我们将其命名为Utils
。
我有一个 proj1
,它依赖于 Utils
。另一个 proj2
依赖于 proj1
和 Utils
.
问题是如果 proj1
和 proj2
都依赖于不同的 Utils
版本,这将导致问题。
最好的解决方案是什么?
这种情况出现在Scala/SBT个项目中,但我猜其他语言也有同样的问题。
Edit:
Just to be clear,
proj2
is the project that will run, that uses some code fromproj1
andUtils
.
您有三个不同的项目:
- 实用程序
- proj1 <- 取决于 Utils v1
- proj2 <- 取决于 Utils v2
确保 proj1 和 proj2 之间没有冲突的唯一方法是 100%
将它们 运行 隔离。
一旦您将 proj1 和 proj2 与不同版本的 Utils 混合在同一个 class 路径上,您最终将覆盖一个或另一个项目。
您可以使用以下方式实现隔离:
- 运行 它们在单独的 JVM 中,具有适当版本的 Utils
- 运行 它们在同一个 JVM 中但在不同的 class 加载器中
这是经典的 Jar Hell,它是任何基于 JVM 的项目的问题,而不仅仅是带有 sbt 的 scala。
常见的解有4种
通过更改代码摆脱冲突,将您的多版本依赖整合为单一依赖。
阴影(如上@Sean Viera 所述)
多类加载器组件架构,如 OSGI(如@tuxdna 所述)
运行 在单独的 JVM 中,如微服务架构(@tuxdna 也提到)