2016-06-24 4 views
1

Ich konnte die Elasticsearch-Java-API nicht über JSP verwenden. Im Folgenden habe ich versucht zu erklären, was ich getan habe. : |Elasticsearch Java-API aus Webanwendungsfehler: java.lang.NoClassDefFoundError: Konnte die Klasse nicht initialisieren org.elasticsearch.threadpool.ThreadPool

Ich habe elasticseach 2.3.3 auf meinem System installiert, indem ich die Anweisung elastic befolgt habe und sie von der Eingabeaufforderung aus starte. Alles funktioniert perfekt. Es kann nützlich sein zu sagen, ich habe die Parameter von elasticsearch.yml geändert.

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

Dann mit Netbeans, ich habe ein Maven-Projekt erstellt -> webanwendungsanwendungsprojekt und die unter Abhängigkeit in pom.xml gesetzt:

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

Auch habe ich die Guava Version 18 Abhängigkeit in Projekt hinzugefügt und dann laden Sie alle Projektabhängigkeiten herunter, indem Sie mit der rechten Maustaste auf Abhängigkeiten klicken und herunterladen Deklarierte Abhängigkeiten. Dann erstellt eine Java-Klasse und schreibt unten Code:

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; 
    } 

} 

Und durch eine jsp Seite versucht, die test() Funktion aufzurufen (Ich werde mit einer Web-Anwendung integrieren Elasticsearch). Immer nach dem Projekt bei der ersten Belastung Aufbau die folgenden Fehler angezeigt:

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

und nach der Seite der Kontext der Fehler Auffrischen ändert sich zu:

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

Dies ist das 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> 

Auch möchte ich erwähnen, mit diesem POM kann ich meine JSON von der main Funktion indexieren. Aber das Problem ist, ich wusste nicht, wie man die Anwendung durch JSP Seiten laufen lässt.

Ich schätze Sie wirklich für das Teilen Ihres Wissens.

Grüße, Amin

+0

Verwenden Sie TransportClient – xeye

+0

Danke @xeye. Ich habe Ihren Vorschlag wie folgt ausprobiert. Trotzdem habe ich den gleichen Fehler. Einstellungen Einstellungen = Settings.builder() .put ("path.home", "d: /elasticsearch-2.3.3") .put ("cluster.home", "cluster_233") .build() ; Client-client = TransportClient.builder(). Einstellungen (Einstellungen) .build() .addTransportAddress (neu InetSocketTransportAddress (InetAddress.getByName ("127.0.0.1"), 9300)) .addTransportAddress (neu InetSocketTransportAddress (InetAddress.getByName ("127.0.0.1"), 9200)); – Amin

Antwort

0

Mit Java-Anwendungen, Fehler wie

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

weisen in der Regel, dass Sie ein fehlen Abhängigkeit oder Sie haben widersprüchliche Abhängigkeit. Zum Beispiel sind Guava 18.0 und Guava 19.0 für Java völlig verschieden, aber sie teilen viel Code. Wenn die Jars geladen werden, wird natürlich zuerst einer geladen, so dass jede versuchte Verwendung der zweiten zu irreführenden Fehlern wie den obigen führt.

Also I have added the Guava version 18 dependency into project and then download all the project dependencies by right clicking on Dependencies and select Download Declared Dependencies

Elasticsearch 2.3.3 already depends on Guava 18.0. Als solche ist es eine transitive Abhängigkeit des Elasticsearch-Projekts.

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

Ihre Maven-Abhängigkeit verursacht wahrscheinlich eine Kollision mit einer Ihrer anderen Abhängigkeiten. Werfen Sie einen Blick auf Ihre Netbeans Abhängigkeiten, oder besser Maven fragen sie direkt zu tun:

mvn dependency:tree -Dverbose 

Dies wird die Abhängigkeitsbaum drucken für Sie Konflikte zu finden. Suchen Sie nach Gläsern, die mit verschiedenen Versionen dupliziert sind, und verhindern Sie, dass die Abweichung auftritt.

Als Nebenbemerkung, zum Zeitpunkt dieser Antwort, Guava 19 ist die neueste Version. Auch wenn ES 2.3.3 Guava 18 haben möchte, könnte eine andere Abhängigkeit von Ihnen leicht eine andere Version von Guava haben.

+0

Ich habe die Abhängigkeit über die Eingabeaufforderung überprüft und das Projekt scheint keine Abhängigkeit zu haben. Bezüglich der Guava installierte das Projekt Version 18.0 und 11.0.1. In der Liste "com.ISTEX: mvnES: war: 1.0-SNAPSHOT" steht nur Guava 18.0 zur Verfügung. @pickypg, Hast du noch eine andere Idee? – Amin

+0

Können Sie das vollständige Maven POM hinzufügen? – pickypg

+0

Ich habe das POM hinzugefügt. Im Moment kann ich mit diesem POM meine JSON-Dateien über eine Java-Anwendung indexieren, aber nicht über eine Web-Anwendung (JSP). Ich denke, es ist ein Problem mit elasticsearch und ** web.xml **. Nicht sicher. – Amin

1

FWIW, ich stieß auf das gleiche Problem wie oben beschrieben - das heißt, die Fehlermeldung, die ich sah, war der Threadpool Initialisierungsfehler der Autor beschreibt. Die beschriebene Lösung in dem unten stehenden Link löste das Problem für mich: https://discuss.elastic.co/t/could-not-initialize-class-org-elasticsearch-threadpool-threadpool/47575

AKTUALISIERTE pro Kommentar Vorschlag: In meinem Fall das Update einen Guave Abhängigkeitseintrag in meiner POM-Datei hinzuzufügen war. Ich habe die Abhängigkeit verwendet, die auf der Webseite unter dem obigen Link angegeben ist:

Das hat zumindest in meinem Fall das Problem gelöst.

+0

Links neigen dazu, im Laufe der Zeit zu brechen. Es wäre gut, wenn Sie die relevanten Teile des Links in Ihre Antwort einfügen, um sie später zu lesen. Vielen Dank. – lrnzcig

Verwandte Themen