elasticsearch - 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
)
但我无法获得可用的阴影版本并在尝试将它们导入项目引用时出错。
解决方案
好吧,在 JVM 上,类路径中只能有一个相同.class
的版本,因此每个构建工具都会尊重这一点。
sbt 将确保项目中只有一个可用的库版本(除非你明确设置它,我会假设它选择所有冲突版本中的最高版本号)所以如果你需要一个由使用的库这两个依赖项我会寻找使用相同版本依赖项的版本。(或显式覆盖版本并使用 sbt-mima 和 sbt-missinglink 来检查此更改是否没有破坏任何内容)。
据我所知,最简单的方法是使用项目页面上的表格(与 maven 一起)为您要使用的 elasticsearch 版本选择正确的 elastic4s 版本。
推荐阅读
- rxjs - 缓存来自 BehaviorSubject 的管道结果
- php - 在 PHP 中使用 simplexml_load_string 后如何检索 XML 的第一个节点?
- android - 如何使用 RXJava 多次调用方法 - 我使用哪个运算符?
- javascript - 从 php 传递到 javascript 有什么问题
- scala - 带有类型参数的 Scala 列表
- bash - Bash if/else 语句未正确管道输出
- swift - 滚动时隐藏 UITableView 复选标记
- amazon-web-services - AWS:子网中分配的 IP 列表
- javascript - 如何将不同表格和日期的数据显示到图表中
- docker - Docker 端口未正确公开