2016-06-24 4 views
1

Я не мог использовать API-интерфейс elasticsearch Java через JSP. В дальнейшем я попытался объяснить, что я сделал. : |Elasticsearch Java API из веб-приложения-ошибки: java.lang.NoClassDefFoundError: не удалось инициализировать класс org.elasticsearch.threadpool.ThreadPool

Я установил упругий элемент 2.3.3 на свою систему, выполнив инструкцию по упругости и запустив ее из командной строки. все работает отлично. Может быть, полезно сказать, что я изменил параметры ниже elasticsearch.yml.

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

Затем с Netbeans, я создал проект Maven -> проект веб-приложения и установить ниже зависимость в pom.xml:

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

Также я добавил зависимость гуавы версии 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 пытались вызвать функцию тест() (я собираюсь интегрировать elasticsearch с веб-приложения). Всегда после сборки проекта при первой загрузке появится ниже сообщение об ошибке:

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 я могу проиндексировать мой JSON из функции main. Но проблема в том, что я не знал, как запустить приложение через JSP страниц.

Я очень ценю вас за то, что поделился своими знаниями.

С уважением, Амин

+0

use TransportClient – xeye

+0

Thanks @xeye. Я попробовал ваше предложение, как показано ниже. Тем не менее, я получил ту же ошибку. Настройки settings = Settings.builder() .put ("path.home", "d: /elasticsearch-2.3.3") .put ("cluster.home", "cluster_233") .build() ; Client клиент = TransportClient.builder(). Настройки (настройки) .build() .addTransportAddress (новый InetSocketTransportAddress (InetAddress.getByName ("127.0.0.1"), 9300)) .addTransportAddress (новый InetSocketTransportAddress (InetAddress.getByName («127.0.0.1»), 9200)); – Amin

ответ

0

С Java-приложений, ошибки как

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

обычно указывают, что вам не хватает или у вас есть конфликтующий зависимость. Например, Guava 18.0 и Guava 19.0 совершенно разные, чем Java, но они имеют много кода. Когда банки загружаются, естественно, сначала загружается, поэтому любое попытка использования второго приведет к ошибочным ошибкам, подобным приведенным выше.

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. Таким образом, это транзитивная зависимость проекта 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, какая-то другая ваша зависимость может легко и разумно хотеть другую версию Guava.

+0

Я проверил зависимость через командную строку, и у проекта, похоже, нет зависимости. Что касается Гуавы, проект установил версию 18.0 и 11.0.1. В списке 'com.ISTEX: mvnES: war: 1.0-SNAPSHOT' доступен только Guava 18.0. @pickypg, есть ли у вас другая идея? – Amin

+0

Можете ли вы добавить полный Maven POM? – pickypg

+0

Я добавил POM. Прямо сейчас с этим POM я могу индексировать файлы JSON через Java-приложение, но не из веб-приложения (JSP). Я думаю, что это некоторая проблема с elasticsearch и ** web.xml **. Не уверен. – Amin

1

FWIW, я столкнулся с той же проблемой, что и описанная выше, то есть сообщение об ошибке, которое я видел, было ошибкой инициализации threadpool, описанной автором. Решение, описанное в ссылке ниже решить эту проблему для меня: https://discuss.elastic.co/t/could-not-initialize-class-org-elasticsearch-threadpool-threadpool/47575

ОБНОВЛЕНО за комментарий предложение: В моем случае, исправление было добавить запись зависимостей гуавы в моем файле POM. Я использовал зависимость приведенной в веб-страницу по ссылке выше:

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

Это, по крайней мере, в моем случае, решить эту проблему.

+0

Ссылки, как правило, со временем сокрушаются. Было бы неплохо, чтобы вы скопировали соответствующие части ссылки в свой ответ для дальнейшего использования. Благодарю. – lrnzcig