Elasticsearch JAR地狱错误

时间:2015-11-28 19:59:24

标签: java elasticsearch java-api

我使用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文件时。导致此错误的原因是什么?

4 个答案:

答案 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>