elasticsearch-rest-client遇到的坑
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的增加,删除,修改等可以参考官方文档,https://www.elastic.co/guide/en/elasticsearch/client/java-rest/6.2/java-rest-high-supported-apis.html。
这样一个简答你的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问题,百度百科有方法:https://jingyan.baidu.com/article/7082dc1c0fdf51e40a89bde1.html
后还有一个坑,由于我的项目是maven管理的web项目。所以jar包使用maven管理,由于发布时候,会吧jar放到web项目的WEB-INF/lib/,在tomcat部署的时候会把lib的jar和maven的jar合并,在部署,所以,maven依赖问题解决了,还有问题,直接看项目运行的实际代码有没有冲突。方法eclips在服务器部署项目,点击browse deployment location 就会跳转到tomcat实际运行的代码中,直接查看lib。
使用maven 经常会发现实际运行代跟开发的不一致,本质就是I,你开发完了的代码没有更新到运行环境中。
相关文章