elasticsearch-rest-client遇到的坑

2020-06-01 00:00:00 版本 运行 项目 依赖 希望

elasticsearch 版本 6.2.4(写该文章的时候已经发布了6.3了)

maven管理。


根据官方介绍:只要在pom.xml 加入依赖


Maven configurationedit

Here is how you can configure the dependency using maven as a dependency manager. Add the following to your pom.xml file:

<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>6.2.4</version>
</dependency>


加入之后查看依赖(打开pom文件,点击dependency Hierarchy)

看到依赖呢跟官网介绍的一样。



这里顺便看看elasticseatch的依赖(因为我跟在跟项目整合时候这个依赖除了问题),如下图看出是依赖了,lucene7.2.1的版本





开始编码:

根据官方demo:

package com.example.demo;


import org.apache.http.HttpHost;

import org.elasticsearch.client.RestClient;

import org.elasticsearch.client.RestHighLevelClient;


public class e

{

public static void main(String[] args)

{

RestHighLevelClient client = new RestHighLevelClient(

RestClient.builder(new HttpHost("localhost", 9200, "http"),

new HttpHost("localhost", 9201, "http")));

System.out.println(client);

}

}

运行报错:java.lang.UnsupportedClassVersionError: com/example/demo/e : Unsupported major.minor version 52.0



这个问题百度一下很好解决:就是JDK版本问题,配置下JDK







在重新运行,没问题了。。。。

为什么要这样实例化呢,也没有文档好参考的。只能看源码:

RestHighLevelClient.java 源码可以看出来。



这个RestHighLevelClient类能使用的构造方法都是需要 RestClient 实例,所以我们需要实例化RestClient

接着我们开RestClient的源码,



找到两个可以实例化的,构造,简单起见我们采用第二种。

然后就是对Elastic的增加,删除,修改等可以参考官方文档,elastic.co/guide/en/ela

这样一个简答你的demo可以实现了。




然后就打算加到项目里面使用。问题就来了。


报错:Exception in thread "main" java.lang.NoSuchFieldError: LUCENE_6_0_0




进去看第44行错误



说是 LUCENE_6_0_0 这个不存在,于是在吧代码复制到,运行环境里面,果然报错。



我们来看看LUCENE_6_0_0 存在哪个jar里面,鼠标跟进去,发现是在lucene-core下的。这个定义在7.2存在,但是我们允许发现没有,估计是这个jar冲突了,运行时候使用的不是这个版本。



然后我们看下依赖:发现在添加到项目里面发现,部分lucene的版本变成3.5.0。



我的解决办法是,直接在pom文件里面指定这个jar的版本



<dependency>

<groupId>org.apache.lucene</groupId>

<artifactId>lucene-core</artifactId>

<version>7.2.1</version>

</dependency>

添加完在看看依赖:lucene-core的版本上去了,同理其他版本意这样改回去。

改了版本,能就能正常建立连接了。


总结

开发没问问题,运行的时候报,类,方法,变量找不到这个多半就是jar冲突了。

快速丁文重提jar问题,百度百科有方法:jingyan.baidu.com/artic


后还有一个坑,由于我的项目是maven管理的web项目。所以jar包使用maven管理,由于发布时候,会吧jar放到web项目的WEB-INF/lib/,在tomcat部署的时候会把lib的jar和maven的jar合并,在部署,所以,maven依赖问题解决了,还有问题,直接看项目运行的实际代码有没有冲突。方法eclips在服务器部署项目,点击browse deployment location 就会跳转到tomcat实际运行的代码中,直接查看lib。

使用maven 经常会发现实际运行代跟开发的不一致,本质就是I,你开发完了的代码没有更新到运行环境中。


相关文章