如何在Scala中使用库的多个版本?

如何在Scala中使用库的多个版本?,scala,sbt,Scala,Sbt,我使用的是Scala中的一个库(比如a),它依赖于另一个库(比如Z)的x.11版本 现在,我也在使用一个库,比如说B,它依赖于Z的x.31版本 这会导致编译错误,因为我们将有两个版本的库Z,如何在scala的sbt中同时使用库A和库B?有没有办法指定它。在sbt中,库之间的冲突是使用冲突管理器配置的。默认情况下,会选择最新版本,但也可以在.sbt文件中覆盖该版本: conflictManager := ConflictManager.strict 如果您使用的是sbt 0.13.6或更高版本,

我使用的是Scala中的一个库(比如a),它依赖于另一个库(比如Z)的x.11版本

现在,我也在使用一个库,比如说B,它依赖于Z的x.31版本


这会导致编译错误,因为我们将有两个版本的库Z,如何在scala的sbt中同时使用库A和库B?有没有办法指定它。

在sbt中,库之间的冲突是使用冲突管理器配置的。默认情况下,会选择最新版本,但也可以在.sbt文件中覆盖该版本:

conflictManager := ConflictManager.strict
如果您使用的是sbt 0.13.6或更高版本,则当您的依赖项之间存在不兼容的二进制版本时,将收到警告。在这种情况下,您可以在sbt文件中为特定库配置覆盖:

dependencyOverrides += "org.raman" % "Z" % "x.11"

这将强制解析版本的
Z
转换为
x.11
,但不会引入直接依赖项。

如果用新版本完全替换一个依赖项,那么Sparko的解决方案就可以工作。然而,情况并非总是如此

如果您希望在sbt assembly生成的uber jar中包含库的两个版本,则需要使用着色。有关什么是着色以及与之相关的一些缺点的概述,请参见

sbt assembly的文档中介绍了着色,但如果您和我一样,他们的解释方式会让您比开始时更加困惑。有一篇很好的博文,(),这有助于揭开它的神秘面纱。以下是相关章节:

我可以在我的typesafe配置版本上加上阴影,给它一个不同的颜色 命名,这样Spark就不会在不同版本之间混淆。我很快就走了 添加到my build.sbt文件中,并添加了以下代码:

程序集中的assemblyShadeRules:=Seq(
rename(“com.typesafe.config.*”->“my_conf.@1”) .inLibrary(“com.typesafe”%”配置“%”1.3.0) (项目中)

根据文档,这应该将任何类置于 新包my_conf下的com.typesafe.config

对于您的情况,解决方案是向
build.sbt
文件中添加类似的内容:

assemblyShadeRules in assembly := Seq(
      ShadeRule.rename("com.somecompany.**" -> "my_conf.@1")
      .inLibrary("com.somecompany" % "libraryZ" % "0.11")
      .inProject
    )

这是否回答了OP的问题?他们想知道“如何在scala的sbt中同时使用库A和库B?”(答案可能是“当然不能”),在运行sbt assembly时,会出现错误,因为库有多个版本。一种方法是排除库中的其他版本,只保留其中一个版本。冲突管理器也适用于程序集吗?您可能可以使用着色处理:您可以详细介绍该解决方案的工作原理吗?第二行的
com.somecompany.*
是否应该引用库A?