我在Scala中使用了一个库A,它依赖于另一个库Z的x.11版本。现在,我还使用了一个库,比如B,它依赖于Z的x.31版本。这会导致编译错误,因为我们有两个版本的库Z,我怎么能在scala的sbt中同时使用库A和库B呢?有什么方法可以指定它吗?
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文件中添加如下内容:
build.sbt
assemblyShadeRules in assembly := Seq( ShadeRule.rename("com.somecompany.**" -> "my_conf.@1") .inLibrary("com.somecompany" % "libraryZ" % "0.11") .inProject )
kuuvgm7e2#
在sbt中,库之间的冲突是通过冲突管理器来配置的,默认情况下,选择最新的版本,但也可以在.sbt文件中覆盖:
conflictManager := ConflictManager.strict
如果你使用的是sbt 0.13.6或更高版本,当你的依赖项之间有不兼容的二进制版本时,你会收到警告。在这种情况下,你可以在sbt文件中为特定的库配置一个覆盖:
dependencyOverrides += "org.raman" % "Z" % "x.11"
这将强制Z的解析版本为x.11,但不会引入直接依赖项。
Z
x.11
2条答案
按热度按时间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
文件中添加如下内容:kuuvgm7e2#
在sbt中,库之间的冲突是通过冲突管理器来配置的,默认情况下,选择最新的版本,但也可以在.sbt文件中覆盖:
如果你使用的是sbt 0.13.6或更高版本,当你的依赖项之间有不兼容的二进制版本时,你会收到警告。在这种情况下,你可以在sbt文件中为特定的库配置一个覆盖:
这将强制
Z
的解析版本为x.11
,但不会引入直接依赖项。