elasticsearch 使用IntelliJ中的Elasticsearch测试框架,如何解决idea\u rt.jar的jar地狱?,elasticsearch,intellij-idea,kotlin,elasticsearch,Intellij Idea,Kotlin" /> elasticsearch 使用IntelliJ中的Elasticsearch测试框架,如何解决idea\u rt.jar的jar地狱?,elasticsearch,intellij-idea,kotlin,elasticsearch,Intellij Idea,Kotlin" />

elasticsearch 使用IntelliJ中的Elasticsearch测试框架,如何解决idea\u rt.jar的jar地狱?

elasticsearch 使用IntelliJ中的Elasticsearch测试框架,如何解决idea\u rt.jar的jar地狱?,elasticsearch,intellij-idea,kotlin,elasticsearch,Intellij Idea,Kotlin,我试图使用提供的Elasticsearch java测试框架对我的es项目进行一些集成测试。 我在IntelliJ中有一个非常简单的测试设置: class FormTest : ESIntegTestCase() { override fun nodeSettings(nodeOrdinal: Int): Settings = Settings.builder() .put(super.nodeSettings(nodeOrdinal)) //.put(

我试图使用提供的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:\Users\user\AppData\Local\JetBrains\Toolbox\apps\IDEA-U\ch-0\181.5281.24\lib\idea_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
java.lang.RuntimeException:在测试类路径中找到jar地狱
在org.elasticsearch.bootstrap.BootstrapForTesting.(BootstrapForTesting.java:92)
位于org.elasticsearch.test.ESTestCase(ESTestCase.java:190)
位于java.lang.Class.forName0(本机方法)
位于java.lang.Class.forName(Class.java:348)
位于com.carrotsearch.randomizedtesting.RandomizedRunner$2.run(RandomizedRunner.java:592)
原因:java.lang.IllegalStateException:jar地狱!
在类路径上复制jar[C:\Users\user\AppData\Local\JetBrains\Toolbox\apps\IDEA-U\ch-0\181.5281.24\lib\IDEA\U rt.jar]:。。。
位于org.elasticsearch.bootstrap.JarHell.parseClassPath(JarHell.java:142)
位于org.elasticsearch.bootstrap.JarHell.parseClassPath(JarHell.java:98)
位于org.elasticsearch.bootstrap.JarHell.checkJarHell(JarHell.java:89)
在org.elasticsearch.bootstrap.BootstrapForTesting.(BootstrapForTesting.java:90)
... 4更多

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

因为我对我的类路径的长度感到惊讶,所以我尝试使用
shorten命令行
选项,这个选项很有效


编辑您的运行配置,并将
Shorten命令行
字段设置为
JAR清单

,当我偶然发现以下内容时,我遇到了相同的问题:

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

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

此外,您可能需要:

对于IDEA 2017.3及更高版本,除了JVM选项外,您还需要转到Run->Edit Configuration->…->Defaults->JUnit,并验证Shorten命令行设置是否设置为user local default:none。如果ant-javafx.jar被报告为JARhell的源代码,那么您可能还需要从类路径中删除它

最后,确保您在以下方面拥有资产:

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


谢谢你的回答,我目前无法证实这一点,但现在将接受它。