我使用Elasticsearch Java API创建了一个Java文件。在NetBeans中,一切正常。
但是,我开始收到以下错误:
org/elasticsearch/plugins/PluginsService.java:342:in `loadBundles': java.lang.IllegalStateException: failed to load bundle [file:/D:/ELK-2.0/elasticsearch-2.0.0/plugins/license/license-2.0.0.jar, file:/D:/ELK-2.0/elasticsearch-2.0.0/plugins/license/license-core-2.0.0.jar, file:/D:/ELK-2.0/elasticsearch-2.0.0/plugins/license/license-plugin-api-2.0.0.jar, file:/D:/ELK-2.0/elasticsearch-2.0.0/plugins/marvel-agent/marvel-agent-2.0.0.jar] due to jar hell
from org/elasticsearch/plugins/PluginsService.java:113:in `<init>'
from org/elasticsearch/node/Node.java:144:in `<init>'
from org/elasticsearch/node/NodeBuilder.java:145:in `build'
from spamdetection/SpamDetection.java:63:in `client'
from spamdetection/SpamDetection.java:30:in `SpammerDetector'
from java/lang/reflect/Method.java:497:in `invoke'
from spam.rb:53:in `(root)'
from spam.rb:53:in `(root)'
Caused by:
JarHell.java:120:in `parseClassPath': java.lang.IllegalStateException: Classpath should not contain empty elements! (outdated shell script from a previous version?) classpath=''
from JarHell.java:95:in `parseClassPath'
from PluginsService.java:338:in `loadBundles'
from PluginsService.java:113:in `<init>'
from Node.java:144:in `<init>'
from NodeBuilder.java:145:in `build'
from SpamDetection.java:63:in `client'
from SpamDetection.java:30:in `SpammerDetector'
from NativeMethodAccessorImpl.java:-2:in `invoke0'
from NativeMethodAccessorImpl.java:62:in `invoke'
from DelegatingMethodAccessorImpl.java:43:in `invoke'
from Method.java:497:in `invoke'
from JavaMethod.java:451:in `invokeDirectWithExceptionHandling'
from JavaMethod.java:312:in `invokeDirect'
from InstanceMethodInvoker.java:45:in `call'
from CachingCallSite.java:326:in `cacheAndCall'
from CachingCallSite.java:170:in `call'
from spam.rb:53:in `__file__'
from spam.rb:-1:in `load'
from Ruby.java:857:in `runScript'
from Ruby.java:850:in `runScript'
from Ruby.java:729:in `runNormally'
from Ruby.java:578:in `runFromMain'
from Main.java:395:in `doRunFromMain'
from Main.java:290:in `internalRun'
from Main.java:217:in `run'
from Main.java:197:in `main'
尝试从JRuby调用我的Java JAR文件时。导致此错误的原因是什么?
答案 0 :(得分:13)
您可以在org.elasticsearch.bootstrap
中创建名为src/test/java
的包,并将此类放在那里:
package org.elasticsearch.bootstrap;
import java.net.URL;
public class JarHell {
private JarHell() {}
public static void checkJarHell() throws Exception {}
public static void checkJarHell(URL urls[]) throws Exception {}
public static void checkVersionFormat(String targetVersion) {}
public static void checkJavaVersion(String resource, String targetVersion) {}
public static URL[] parseClassPath() {return new URL[]{};}
}
这样做的好处是,使用节点构建器初始化节点的生产代码可以保持干净,只有在单元测试中才会禁用jar地狱检查。
答案 1 :(得分:3)
如果你正在接受&#34; jar hell&#34;运行单元测试时出错,黑客应该照顾它 - 同意它不是一种优雅的方式。
String originalClassPath = System.getProperty("java.class.path");
String[] classPathEntries = originalClassPath.split(";");
StringBuilder esClasspath = new StringBuilder();
for (String entry : classPathEntries) {
if (entry.contains("elasticsearch") || entry.contains("lucene")) {
esClasspath.append(entry);
esClasspath.append(";");
}
}
System.setProperty("java.class.path", esClasspath.toString());
node = nodeBuilder().local(true).settings(settings).node();
System.setProperty("java.class.path", originalClassPath);
答案 2 :(得分:3)
你现在可以disable&#34; jar hell&#34;通过tests.jarhell.check
属性在测试期间进行检查。
答案 3 :(得分:1)
我迟到了,但我认为我的答案可能在将来帮助其他人,这就是我发布它的原因。
我认为正确的解决方案是找到根本原因并排除产生jar地狱的库而不是隐藏问题。例如,在我的情况下,我有以下重复的库:
Caused by: java.lang.IllegalStateException: jar hell!
class: org.hamcrest.BaseDescription
jar1: C:\Users\Yeikel\.m2\repository\org\hamcrest\hamcrest-all\1.3\hamcrest-all-1.3.jar
jar2: C:\Users\Yeikel\.m2\repository\org\hamcrest\hamcrest-core\1.3\hamcrest-core-1.3.jar
at org.elasticsearch.bootstrap.JarHell.checkClass(JarHell.java:275)
at org.elasticsearch.bootstrap.JarHell.checkJarHell(JarHell.java:192)
at org.elasticsearch.bootstrap.JarHell.checkJarHell(JarHell.java:89)
at org.elasticsearch.bootstrap.BootstrapForTesting.<clinit>(BootstrapForTesting.java:90)
我所做的就是找到重复的问题并将其从我的库中排除。在这种情况下,库也与JUnit捆绑在一起
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.hamcrest</groupId>
<artifactId>hamcrest-core</artifactId>
</exclusion>
</exclusions>
</dependency>