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

时间:2015-12-22 08:53:00

标签: scala sbt

我正在使用一个库,在Scala中说A,它依赖于另一个库的版本x.11说Z.

现在,我还使用了一个库B,它依赖于Z的版本x.31。

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

2 个答案:

答案 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" ,但不会直接依赖。