首页 > 解决方案 > 使用maven在java应用程序中运行两个版本的elasticsearch

问题描述

我有一个遗留的单体应用程序,它使用elasticsearch 1.X,现在我们需要在同一个应用程序中运行elasticsearch 7.X,以便在两个版本的elasticsearch 中使用相同的应用程序索引和查询数据。

在我的项目中,有多个模块,它们都有自己的 POM 和父 POM,而我使用 elasticsearch 7.X 的新模块依赖于一些使用 1.X 的模块。

尽管我在使用 7.X 的模块中排除了 1.X 特定依赖项,但它仍然给我以下错误:

[76B7CCD2] java.lang.NoSuchFieldError: org.elasticsearch.common.io.stream.StreamInput.(StreamInput.java:114) 的 org.elasticsearch.Version.(Version.java:49) 的最新版本

经过大量研究并使用链接和链接后,正如所解释的,我排除了弹性 1.x 依赖项,但看起来仍然像我的其他子模块仍然具有 ES 1.X 并且也是必需的,因此总体类路径为我的应用程序具有org.elasticsearch.Version来自同一个包的两个版本的java 类org.elasticsearch,我认为这是根本原因。

现在,我如何从同一个库的两个不同版本的同一个包中包含同一个类。

标签: javamavenelasticsearchmaven-shade-plugin

解决方案


你不能。您只能拥有一个具有给定完整限定名称(包 + 名称)的类。

您可以尝试使用 Maven 遮罩插件(实际上从未尝试过)遮蔽其中一个包(即重命名它),这可能会起作用。

通常,您需要更改代码并摆弄,直到找到适用于所有依赖项的 elasticsearch 版本。


推荐阅读