Scala SBT:可以将相同依赖项的两个不同版本导入一个构建文件吗?

时间:2018-09-12 14:16:55

标签: scala sbt dependency-management

我需要升级一个库,并且新版本中有重大更改。我想知道是否可以使用sbt将两个版本一起导入,并且如果存在的话,让较新的版本类覆盖较早的版本类。我认为这将使我能够优雅地进行升级,而不会出现编译错误,直到我可以完全摆脱旧版本为止。

这甚至可能吗?我到目前为止还没有发现任何可能的方法,因此,如果没有这种方法,那么比用新版本替换旧版本并一步一步解决所有这些错误,还有一种更好的迁移方法吗?

带有光滑库的示例(导致未解决的依赖项错误)

libraryDependencies ++= Seq(
  "com.typesafe.slick" %% "slick" % "2.1.0",
  "com.typesafe.slick" %% "slick" % "3.0.0"
)

我将不胜感激任何提示或指示。谢谢!

3 个答案:

答案 0 :(得分:2)

  

具有较新的版本类将覆盖较旧的版本类(如果存在)

我相信这是不可能的。

您遇到的东西通常称为“ JAR Hell”。我知道解决此问题的唯一方法是使用阴影依赖关系(示例请参见https://github.com/sbt/sbt-assembly#shading),但这会导致其他问题。

最干净的解决方案(不幸的是,它也是最有效的方法)是硬着头皮立即解决所有问题。

答案 1 :(得分:1)

无法完成此操作,因为您只能在类路径中使用一个版本的依赖项。即使有强制的方法,也无法在导入时区分所需的版本。

值得一提的是OSGi,因为Java / Maven / etc由于JVM类加载器的工作原理而遭受相同的问题。

答案 2 :(得分:0)

根据您所使用的库子集的复杂程度,有可能围绕界面类似于2.1.0(仅用于实际使用的东西)但用术语实现的光滑对象编写包装器3.0.0。不过,这可能并不简单且耗时。