首页 > 解决方案 > sbt无法在项目中导入两个不同版本的elasticsearch库

问题描述

我正在尝试使用 scala 代码连接两个弹性搜索集群并从中查询弹性搜索。在 scala 项目的 build.sbt 中使用以下库和代码:

libraryDependencies +="org.elasticsearch" % "elasticsearch" % "7.2.0"
libraryDependencies += "org.elasticsearch.client" % "elasticsearch-rest-high-level-client" % "7.2.0"

val elastic4sVersion = "6.2.8"
libraryDependencies ++= Seq(
  "com.sksamuel.elastic4s" %% "elastic4s-core" % elastic4sVersion,
  // for the http client
  "com.sksamuel.elastic4s" %% "elastic4s-http" % elastic4sVersion,
)

它们有一个通用的客户端库,在构建时会丢失。我可以看到 6.x 或 7.x,但不能同时看到两者。我尝试了着色方法

assemblyShadeRules in assembly := Seq(
  ShadeRule.rename("org.elasticsearch.client.**" -> "my_conf.@1")
    .inLibrary("org.elasticsearch.client" % "elasticsearch-rest-high-level-client" % "7.2.0")
    .inAll
)

assemblyShadeRules in assembly := Seq(
  ShadeRule.rename("org.elasticsearch.client.**" -> "my_conf_1.@1")
    .inLibrary("org.elasticsearch.client" % "elasticsearch-rest-high-level-client" % "6.2.2")
    .inAll
)
assemblyShadeRules in assembly := Seq(
  ShadeRule.rename("org.elasticsearch.elasticsearch.**" -> "my_configuration.@1")
    .inLibrary("org.elasticsearch" % "elasticsearch" % "7.2.0")
      .inAll
)

但我无法获得可用的阴影版本并在尝试将它们导入项目引用时出错。

标签: elasticsearchsbtsbt-assemblysbt-pluginelastic4s

解决方案


好吧,在 JVM 上,类路径中只能有一个相同.class的版本,因此每个构建工具都会尊重这一点。

sbt 将确保项目中只有一个可用的库版本(除非你明确设置它,我会假设它选择所有冲突版本中的最高版本号)所以如果你需要一个由使用的库这两个依赖项我会寻找使用相同版本依赖项的版本。(或显式覆盖版本并使用 sbt-mima 和 sbt-missinglink 来检查此更改是否没有破坏任何内容)。

据我所知,最简单的方法是使用项目页面上的表格(与 maven 一起)为您要使用的 elasticsearch 版本选择正确的 elastic4s 版本。


推荐阅读