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

ldioqlga  于 2023-03-18  发布在  Scala
关注(0)|答案(2)|浏览(149)

我在Scala中使用了一个库A,它依赖于另一个库Z的x.11版本。
现在,我还使用了一个库,比如B,它依赖于Z的x.31版本。
这会导致编译错误,因为我们有两个版本的库Z,我怎么能在scala的sbt中同时使用库A和库B呢?有什么方法可以指定它吗?

4si2a6ki

4si2a6ki1#

如果用一个新版本完全替换一个依赖项碰巧有效,那么Sparko的解决方案就有效。
如果你想在sbt-assembly生成的uber-jar中包含一个库的两个版本,你需要使用shading,参见this post了解shading的概述,以及与之相关的一些缺点。
着色在sbt-assembly的文档中有介绍,但是如果你和我一样,他们解释着色的方式会让你比开始时更困惑,有一篇很好的博客文章Spark, Uber Jars and Shading with sbt-assembly,帮助你揭开了它的神秘面纱,下面是相关的部分:
我可以在我的typesafe config版本上加上阴影,给它一个不同的名字,这样Spark就不会在不同的版本之间混淆了。我很快找到我的build.sbt文件,添加了以下代码:
assemblyShade组件中的规则:= Seq(
着色规则。重命名(“com. typesafe”配置。**”-〉“my_conf.@1”)。在库中(“com.typesafe”%“配置”%“1.3.0”)。在项目中)
根据文档,这应该将com.typesafe.config下的任何类都放在新包my_conf下。
对于您的情况,解决方案是向build.sbt文件中添加如下内容:

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

kuuvgm7e2#

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

conflictManager := ConflictManager.strict

如果你使用的是sbt 0.13.6或更高版本,当你的依赖项之间有不兼容的二进制版本时,你会收到警告。在这种情况下,你可以在sbt文件中为特定的库配置一个覆盖:

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

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

相关问题