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

And*_*ann 3 intellij-idea elasticsearch kotlin

我正在尝试使用提供的 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()
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,当我运行它时,出现以下异常:

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
Run Code Online (Sandbox Code Playgroud)

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

Dan*_*ber 6

当我偶然发现时,我遇到了同样的问题: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 J​​VM 选项来实现。或者,可以在idea.properties中设置idea.no.launcher=true

此外,您可能需要:

对于 IDEA 2017.3 及以上版本,除了 JVM 选项之外,您还需要转到 Run->Edit Configurations->...->Defaults->JUnit 并验证 Shorten 命令行设置是否设置为用户本地默认值: 没有任何。如果被报告为 jar 地狱的来源,您可能还需要从类路径中删除 ant-javafx.jar。

最后,确保你有断言:

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