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

标签 maven netbeans elasticsearch threadpool java

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

我已经按照 flex 指令在系统上安装了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页面运行应用程序。

非常感谢您分享您的知识。

问候,
阿敏

最佳答案

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>

至少就我而言,这解决了问题。

关于maven - Web应用程序中的Elasticsearch Java API错误:java.lang.NoClassDefFoundError:无法初始化类org.elasticsearch.threadpool.ThreadPool,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38016757/

相关文章:

java - 在 WAR 文件的 lib 目录中包含源 JAR(Web 应用程序的)

java - 为什么 Netbeans 不能正确显示波斯语字符

Elasticsearch 相当于 Map-Reduce

java - Spring Data Elasticsearch MultiField的Mainfield名称属性不起作用

maven-2 - Maven-替换Jar中的文件

java - 如何在maven中设置jdk的自定义版本?

java - 如何在 NetBeans 中为企业项目设置 TomEE?

Elasticsearch 6.3 绑定(bind)或发布到非环回地址,强制执行 Bootstrap 检查

java - IntelliJ CheckerFramework 插件

java - NetBeans Java 项目文件夹与项目位置