我正在使用一个库,在Scala中说A,它依赖于另一个库的版本x.11说Z.
现在,我还使用了一个库B,它依赖于Z的版本x.31。
这会导致编译错误,因为我们将有两个版本的库Z,如何在scala的sbt中使用库A和B?有没有办法指定它。
答案 0 :(得分:1)
如果完全用新版本替换一个依赖项,那么Sparko的解决方案就可以正常工作。但是,情况并非如此。
如果要在sbt-assembly生成的超级jar中包含两个版本的库,则需要使用着色。有关阴影的概述以及与之相关的一些缺点,请参见this post。
着色已包含在sbt-assembly的文档here中,但如果您像我一样,他们解释它的方式会让您比开始时更加困惑。有一篇好文章Spark, Uber Jars and Shading with sbt-assembly,有助于揭开它的神秘色彩。以下是相关部分:
我可以遮蔽我的类型安全配置版本,给它一个不同的 因此Spark不会在版本之间混淆。我很快就去了 到我的build.sbt文件,并添加了以下代码:
装配中的assemblyShadeRules:= Seq(
ShadeRule.rename(" com.typesafe.config。**" - >" my_conf。@ 1") .inLibrary(" com.typesafe"%" config"%" 1.3.0") .inProject)根据文档,这应该放在任何类 新包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
)
答案 1 :(得分:0)
在sbt中,使用冲突管理器配置库之间的冲突。默认情况下,会选择最新版本,但也可以在.sbt文件中重写:
QueryBuilder
如果您正在使用sbt 0.13.6或更高版本,那么当您的依赖项之间存在不兼容的二进制版本时,将会收到警告。在这种情况下,您可以在sbt文件中为特定库配置覆盖:
// insert one plan
DB::table('plans')->insert([ $array ]);
$plan = Plans::find( DB::getPdo()->lastInsertId() );
// insert multiple plans in one query
$plans = [ $plan_a_arr, $plan_b_arr, .. ];
DB::table('plans')->insert( $plans );
这会强制解析后的conflictManager := ConflictManager.strict
版本为dependencyOverrides += "org.raman" % "Z" % "x.11"
,但不会直接依赖。