在IntelliJ中使用Elasticsearch测试框架,如何解决关于idea_rt.jar的罐子地狱?



我正在尝试使用提供的Elasticsearch java测试框架对我的es项目进行一些集成测试。 我在IntelliJ中有一个非常简单的测试设置:

class FormTest : ESIntegTestCase() {
override fun nodeSettings(nodeOrdinal: Int): Settings = Settings.builder()
.put(super.nodeSettings(nodeOrdinal))
//.put("node.mode", "network")
.build()
@org.junit.Test fun start() {
ensureGreen()
}
}

但是,当我运行它时,我得到以下异常:

java.lang.RuntimeException: found jar hell in test classpath
at org.elasticsearch.bootstrap.BootstrapForTesting.<clinit>(BootstrapForTesting.java:92)
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: jar hell!
duplicate jar [C:UsersuserAppDataLocalJetBrainsToolboxappsIDEA-Uch-0181.5281.24libidea_rt.jar] on classpath: ...
at org.elasticsearch.bootstrap.JarHell.parseClassPath(JarHell.java:142)
at org.elasticsearch.bootstrap.JarHell.parseClassPath(JarHell.java:98)
at org.elasticsearch.bootstrap.JarHell.checkJarHell(JarHell.java:89)
at org.elasticsearch.bootstrap.BootstrapForTesting.<clinit>(BootstrapForTesting.java:90)
... 4 more

我找到了一些绕过罐子地狱检查的方法,但是如何解决问题?

当我偶然发现时,我遇到了同样的问题:https://github.com/elastic/elasticsearch/blob/master/CONTRIBUTING.md#configuring-ides-and-running-tests

特别是,我必须设置idea.no.launcher=true并重新启动我的IntelliJ。

为了直接从 IDEA 2017.2 及更高版本运行测试,需要禁用 IDEA 运行启动器,以避免idea_rt.jar导致"jar 地狱"。这可以通过添加 -Didea.no.launcher=true JVM 选项来实现。或者,idea.no.launcher=true 可以在 idea.properties 中设置

此外,您可能需要:

对于 IDEA 2017.3 及更高版本,除了 JVM 选项之外,您还需要转到运行->编辑配置->...->默认值->JUnit,并验证缩短命令行设置是否设置为用户本地默认值:无。您可能还需要从类路径中删除 ant-javafx.jar 如果它被报告为 jar 地狱的来源。

最后,确保您有断言:

Elasticsearch代码库大量使用Java断言,测试运行器要求在JVM中启用断言。这可以通过在启动时将标志 -ea 传递给 JVM 来实现。

由于我对我的类路径有多长感到惊讶,所以我尝试使用shorten command line选项,它有效。

编辑运行配置并将Shorten command line字段设置为JAR manifest

最新更新