来自Web应用程序的Elasticsearch Java API错误:java.lang.NoClassDefFoundError:无法初始化类org.elasticsearch.threadpool.ThreadPool

时间:2016-06-24 15:16:28

标签: maven netbeans elasticsearch threadpool java-api

我无法通过JSP使用elasticsearch Java API。在下文中,我试图解释我所做的事情。 :|

我已按照弹性指令在我的系统上安装了elasticseach 2.3.3,并从命令提示符运行它。一切都很完美。可能有用的是,我已经从elasticsearch.yml更改了以下参数。

cluster.name: cluster_233
node.name: node_233
bootstrap.mlockall: true
network.host: 127.0.0.1

然后使用Netbeans,我创建了一个Maven项目 - > Web应用程序项目并在pom.xml中设置以下依赖项:

<dependency>
   <groupId>org.elasticsearch</groupId>
   <artifactId>elasticsearch</artifactId>
   <version>2.3.3</version>
   <type>jar</type>
</dependency>

此外,我已将Guava版本18依赖项添加到项目中,然后通过右键单击依赖项并选择下载已声明的依赖项来下载所有项目依赖项。然后创建了一个java类并编写如下代码:

package com.mycompany.esmaven;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import org.elasticsearch.client.Client;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.node.Node;
import org.elasticsearch.node.NodeBuilder;

public class aClass {

    public String test() throws Exception {

        String str = tryToIndex();

        String dfd = "";
        return str;
    }

    public String tryToIndex() throws Exception {

        Node node = NodeBuilder.nodeBuilder().settings(
                Settings.builder()
                        .put("path.home", "d:/elasticsearch-2.3.3")
                        .put("cluster.home", "cluster_233")

        ).node();

        Client client = node.client();
        client.prepareIndex("kodcucom", "article", "1")
                .setSource(putJsonDocument("ElasticSearch: Java API",
                        "ElasticSearch provides the Java API, all operations "
                        + "can be executed asynchronously using a client object.",
                        new Date(),
                        new String[]{"elasticsearch"},
                        "Hüseyin Akdoğan")).execute().actionGet();
        node.close();

        return "Done";
    }

    public static Map<String, Object> putJsonDocument(String title,
            String content, Date postDate, String[] tags, String author) {

        Map<String, Object> jsonDocument = new HashMap<String, Object>();
        jsonDocument.put("title", title);
        jsonDocument.put("conten", content);
        jsonDocument.put("postDate", postDate);
        jsonDocument.put("tags", tags);
        jsonDocument.put("author", author);
        return jsonDocument;
    }

}

通过jsp页面试图调用 test()函数(我将把elasticsearch与web应用程序集成)。始终在第一次加载后构建项目时,将出现以下错误:

java.lang.NoSuchMethodError: com.google.common.util.concurrent.MoreExecutors.directExecutor()Ljava/util/concurrent/Executor;

在刷新页面后,错误的上下文将变为:

java.lang.NoClassDefFoundError: Could not initialize class org.elasticsearch.threadpool.ThreadPool

这是POM:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.ISTEX</groupId>
    <artifactId>mvnESwebapp</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>war</packaging>

    <name>mvnESwebapp</name>

    <properties>
        <endorsed.dir>${project.build.directory}/endorsed</endorsed.dir>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>2.4.1</version>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                        <configuration>
                            <transformers>
                                <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/>
                            </transformers>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

    <dependencies>
        <dependency>
            <groupId>org.elasticsearch</groupId>
            <artifactId>elasticsearch</artifactId>
            <version>2.3.3</version>
        </dependency>
        <dependency>
            <groupId>javax</groupId>
            <artifactId>javaee-web-api</artifactId>
            <version>7.0</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>
</project>

另外,我想提一下,通过这个POM,我可以从main函数索引我的JSON。但问题是我不知道如何通过JSP页面运行应用程序。

我真的很感谢你分享你的知识。

此致 阿明

2 个答案:

答案 0 :(得分:1)

FWIW,我遇到了与上述相同的问题 - 也就是说,我看到的错误消息是作者描述的线程池初始化错误。以下链接中描述的解决方案为我解决了问题: https://discuss.elastic.co/t/could-not-initialize-class-org-elasticsearch-threadpool-threadpool/47575

根据评论建议更新: 在我的例子中,修复是在我的POM文件中添加一个guava依赖项。我使用了上面链接网页中给出的依赖关系:

<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>19.0</version>
</dependency>

至少在我的情况下,解决了这个问题。

答案 1 :(得分:0)

使用Java应用程序,错误如

  • java.lang.NoSuchMethodError
  • java.lang.NoClassDefFoundError

通常表示您缺少依赖项,或者您有冲突的依赖项。例如,就Java而言,Guava 18.0和Guava 19.0完全不同,但它们共享大量代码。当装载罐子时,首先会自然加载,因此任何尝试使用第二个都会导致误导性错误,如上所述。

  

此外,我已将Guava版本18依赖项添加到项目中,然后通过右键单击Dependencies并选择Download Declared Dependencies

来下载所有项目依赖项。

Elasticsearch 2.3.3 already depends on Guava 18.0。因此,它是Elasticsearch项目的传递依赖。

<dependency>
   <groupId>org.elasticsearch</groupId>
   <artifactId>elasticsearch</artifactId>
   <version>2.3.3</version>
   <type>jar</type>
</dependency>

您的Maven依赖项可能会与您的其他某个依赖项发生冲突。看一下你的Netbeans依赖关系,或者更恰当地让Maven直接去做:

mvn dependency:tree -Dverbose

这将打印出依赖关系树,以便您找到冲突。寻找与不同版本重复的罐子,并防止不匹配发生。

作为旁注,在回答这个问题时,Guava 19是最新版本。因此,即使ES 2.3.3想要Guava 18,你的其他一些依赖也可以轻松而合理地想要一个不同版本的番石榴。