elasticsearch 6 ESIntegTestCase"已经设置了codebase属性"

时间:2018-06-13 09:36:50

标签: java elasticsearch

我尝试从2.3.4升级到ES 6.2。

以前,我们使用NodeBuilder并运行本地ES节点来集成测试代码。如果可能的话,我宁愿将其换成ESIntegTestCase用法。

但是,当我尝试运行集成测试时,我收到以下错误:

at org.elasticsearch.bootstrap.BootstrapForTesting.<clinit>(BootstrapForTesting.java:164) at org.elasticsearch.test.ESTestCase.<clinit>(ESTestCase.java:190) at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Class.java:348) at com.carrotsearch.randomizedtesting.RandomizedRunner$2.run(RandomizedRunner.java:592) Caused by: java.lang.IllegalStateException: codebase property already set: codebase.metrics-core -> file:/Users/me/.m2/repository/io/dropwizard/metrics/metrics-core/3.1.0/metrics-core-3.1.0.jar, cannot set to file:/Users/me/.m2/repository/com/yammer/metrics/metrics-core/2.2.0/metrics-core-2.2.0.jar at org.elasticsearch.bootstrap.Security.readPolicy(Security.java:236) at org.elasticsearch.bootstrap.BootstrapForTesting.<clinit>(BootstrapForTesting.java:139) ... 4 more

这意味着什么,我该如何解决?

我的测试类注释为:@RunWith(com.carrotsearch.randomizedtesting.RandomizedRunner.class)并扩展ESIntegTestCase,如果这有帮助的话。

感谢任何人提供的任何帮助!

2 个答案:

答案 0 :(得分:2)

如果开发一个插件仍需要嵌入式ES,则可以设置系统属性-Dtests.gradle=false可以解决此问题。

因为BootstrapForTesting.java L175包含:

if (System.getProperty("tests.gradle") == null) {
  addClassCodebase(codebases, "plugin-classloader", "org.elasticsearch.plugins.ExtendedPluginsClassLoader");
  addClassCodebase(codebases, "elasticsearch-secure-sm", "org.elasticsearch.secure_sm.SecureSM");
}

答案 1 :(得分:1)

根据这个问题:https://github.com/elastic/elasticsearch/issues/21544 ESIntegTestCase也应该不再使用,除非您正在测试插件或类似内容(请参阅此处的回复帖子:https://discuss.elastic.co/t/how-do-i-deal-with-this-particular-jar-hell-issue/135662/4)。

请点击此处了解详情:https://discuss.elastic.co/t/codebase-property-already-set-when-running-esintegtestcase/135659/2

我现在发现的弹性搜索集成测试的最佳最佳方法在讨论帖子中提到:使用testcontainers-elasticsearch(https://github.com/dadoonet/testcontainers-java-module-elasticsearch

您需要在运行测试的计算机上安装docker,但它会自动拉出所需的docker镜像,启动容器并在最后再将其拆除。

相关问题