如何解决Scala/SBT中的传递依赖版本冲突

6

我有一个包含多个实用类的项目,我们称之为Utils

我有一个依赖于Utilsproj1。还有另一个依赖于proj1Utilsproj2

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

最好的解决方案是什么?

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

编辑:

只是为了明确起见,proj2是将运行的项目,它使用来自proj1Utils的一些代码。


真的没有最好的解决方案,只有权宜之计和很多希望。你将不得不在某个时候选择一个 Utils 版本而不是另一个版本。如果是较新的版本,你最好希望它向后兼容。如果是旧版本,你最好希望库没有使用任何尚不存在的方法。无论哪种方式,交叉你的手指并尝试,这是我能想到的唯一解决方案(当然,如果更新项目以使用相同版本的 Utils 不可行)。 - Tunaki
1
utils是另一个子项目还是可以分离出来单独发布?sbt-assembly项目支持阴影(shading),因此您可以通过更改旧依赖项的名称来处理冲突。 - Sean Vieira
@SeanVieira 这是三个不同的项目,没有涉及到子项目。 - pedrorijo91
2个回答

3
这是经典的Jar Hell问题,不仅在scala与sbt相关的项目中,在任何基于JVM的项目中都会出现。
有4个常见解决方案:
  1. 通过改变代码消除冲突,将多版本依赖合并为单一依赖。

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

  3. 多ClassLoader组件架构,如OSGI(如@tuxdna所述)

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


1

你有三个不同的项目:

  • Utils
  • proj1 <- 依赖于 Utils v1
  • proj2 <- 依赖于 Utils v2

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

一旦你在相同的 classpath 上混合使用不同版本的 Utils,你就会覆盖其中一个项目。

你可以通过以下方式实现隔离运行:

  • 在适当版本的 Utils 中分别在独立的 JVM 中运行它们
  • 在同一 JVM 中但在不同的类加载器中运行它们

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接