elasticsearch 使用IntelliJ中的Elasticsearch测试框架,如何解决idea\u rt.jar的jar地狱?
我试图使用提供的Elasticsearch java测试框架对我的es项目进行一些集成测试。 我在IntelliJ中有一个非常简单的测试设置: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(
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来实现
谢谢你的回答,我目前无法证实这一点,但现在将接受它。