sbt无法在项目中导入两个不同版本的elasticsearch库

Posted

技术标签:

【中文标题】sbt无法在项目中导入两个不同版本的elasticsearch库【英文标题】:sbt unable to import two elasticsearch libraries of different version in project 【发布时间】:2020-10-30 03:25:44 【问题描述】:

我正在尝试使用 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
)

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

【问题讨论】:

【参考方案1】:

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

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

据我所知,最简单的方法是使用the table on projects page(与 maven 一起)为您要使用的 elasticsearch 版本选择正确的 elastic4s 版本。

【讨论】:

他们已将客户端连接的配置从 es6 更改为 es7。我找不到一个库可以同时为 elastic4s 6.2 和 Rest 高级客户端连接提供服务,以便在同一个项目中使用 elasticsearch7 进行连接。 你不能在同一个项目中使用同一个库的两个版本。时期。如果你需要使用 ES6,那么表格显示 6.7.7 是支持 ES6 的最后一个版本。并且有很多“高级”集成与该版本号 search.maven.org/… - 如果您需要 7.8.0(或 7.2.0 等等),那么也有集成:search.maven.org/…

以上是关于sbt无法在项目中导入两个不同版本的elasticsearch库的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 IntelliJ Idea 创建 SBT 项目?

SBT 多项目构建:针对不同子项目的 2 个不同版本的 sbt play 插件

无法在 virtualenv 中导入 django,但在停用时可以工作

在 Android Studio 中导入 Google Play Services 库

无法在 VSCode Java 项目中导入包

如何在 django 项目中导入和显示 csv 文件