解決 Elasticsearch 使用 Java High Level REST Client 時出現 NoClassDefFoundError 錯誤
因為工作關係需要用到 Elasticsearch,評估過後決定使用 high-level REST client 來進行開發,但在環境建置上卻出現了一些問題
錯誤訊息如下:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'restHighLevelClient' defined in class path resource [org/springframework/boot/autoconfigure/elasticsearch/rest/RestClientAutoConfiguration$RestHighLevelClientConfiguration.class]: Post-processing of merged bean definition failed; nested exception is java.lang.IllegalStateException: Failed to introspect Class [org.elasticsearch.client.RestHighLevelClient] from ClassLoader [jdk.internal.loader.ClassLoaders$AppClassLoader@5a2e4553]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:553) ~[spring-beans-5.1.2.RELEASE.jar:5.1.2.RELEASE]
at (中略...)Caused by: java.lang.NoClassDefFoundError: org/elasticsearch/client/Cancellable
at java.base/java.lang.Class.getDeclaredMethods0(Native Method) ~[na:na]
at java.base/java.lang.Class.privateGetDeclaredMethods(Class.java:3119) ~[na:na]
at java.base/java.lang.Class.getDeclaredMethods(Class.java:2268) ~[na:na]
at org.springframework.util.ReflectionUtils.getDeclaredMethods(ReflectionUtils.java:662) ~[spring-core-5.1.2.RELEASE.jar:5.1.2.RELEASE]
... 27 common frames omittedCaused by: java.lang.ClassNotFoundException: org.elasticsearch.client.Cancellable
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:582) ~[na:na]
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:190) ~[na:na]
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:499) ~[na:na]
... 31 common frames omitted
原始錯誤訊息非常長所以中間截掉一些,但基本上可以看得出來是有一些 class 找不到
在網路上搜尋到一些解法,大部分都是説少了 Elasticsearch 的核心 dependency,也有些說是底層 Lucene 版本衝突,然而我的 pom.xml 已經加上核心的 dependency 了
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>7.5.0</version>
</dependency>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>7.5.0</version>
</dependency>
也確認過沒有另外 import Lucene 造成版本衝突,那麼還有什麼原因呢?
之後打開專案的 External Libraries 來檢查後看到有個可疑的地方

External Libraries
齁齁,看起來就是你在使壞(?
在 Elasticsearch 的官方文件中有提到:
We released a low-level REST client in 2016, which is based on the well known Apache HTTP client and it allows to communicate with an Elasticsearch cluster in any version using HTTP. On top of that we released the high-level REST client which is based on the low-level client but takes care of request marshalling and response un-marshalling.
可以知道 high-level REST client 是基於 low-level REST client 的,但在 high-level 的 dependency 頁面中卻說只需要加入核心就好,並沒有另外提到要加入 low-level 的 library:

high-level dependency
雖然實際上核心的確有幫我們載入 low-level 的 library 沒錯,但版本卻沒有對應到我 high-level 所需要的 7.5.0 版本啊!
因此我們需要做的,就是自已手動把 low-level 的client 自己加入到 pom.xml 裡面:
<dependency>
<groupId>org.elasticsearch</groupId>
<artifactId>elasticsearch</artifactId>
<version>7.5.0</version>
</dependency>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-client</artifactId>
<version>7.5.0</version>
</dependency>
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>elasticsearch-rest-high-level-client</artifactId>
<version>7.5.0</version>
</dependency>
就可以順利解決這個問題囉!

正確的版本
最後溫馨提醒一下,如果在網路上搜尋 ES 的相關實作,有很多範例都是使用 ES 的 transport client(大部分都是簡體字的文章),但這個在 7.X 版本中已經 deprecated 了,預計在 8.X 版本中會移除掉,實作前記得看清楚喔
參考資料:
https://www.elastic.co/guide/en/elasticsearch/client/java-rest/master/_motivations_around_a_new_java_client.html
https://www.elastic.co/guide/en/elasticsearch/client/java-rest/7.5/java-rest-high-getting-started-dependencies.html
https://stackoverflow.com/questions/46854919/noclassdeffounderror-error-creating-resthighlevelclient-bean
解決 Elasticsearch 使用 Java High Level REST Client 時出現 NoClassDefFoundError 錯誤的更多相关文章
- Java操作Elasticsearch 之 [Java High Level REST Clientedit]
1. 简述 Elasticsearch 是基于 Lucene 开发的一个分布式全文检索框架,向 Elasticsearch 中存储和从 Elasticsearch 中查询,格式是json. 向 Ela ...
- 使用Java High Level REST Client操作elasticsearch
Java高级别REST客户端(The Java High Level REST Client)以后简称高级客户端,内部仍然是基于低级客户端.它提供了更多的API,接受请求对象作为参数并返回响应对象,由 ...
- 使用Java Low Level REST Client操作elasticsearch
Java REST客户端有两种风格: Java低级别REST客户端(Java Low Level REST Client,以后都简称低级客户端算了,难得码字):Elasticsearch的官方low- ...
- Elasticsearch java api操作(二)(Java High Level Rest Client)
一.说明: 一.Elasticsearch提供了两个JAVA REST Client版本: 1.java low level rest client: 低级别的rest客户端,通过http与集群交互, ...
- Elasticsearch java api操作(一)(Java Low Level Rest Client)
一.说明: 一.Elasticsearch提供了两个JAVA REST Client版本: 1.java low level rest client: 低级别的rest客户端,通过http与集群交互, ...
- Java High Level REST Client 使用示例
概述 ES 在 7.0 版本开始将废弃 TransportClient,8.0 版本开始将完全移除 TransportClient,取而代之的是 High Level REST Client,官方文档 ...
- Java High Level REST Client 中文API(仅供参考)
1.初始化 兼容性 Java High Level REST Client需要Java 1.8,并依赖于Elasticsearch核心项目,客户端版本与客户端开发的Elasticsearch版本相同, ...
- 【ES】Java High Level REST Client 使用示例(增加修改)
ES提供了多种编程语言的链接方式,有Java API,PHP API,.NET API 官网可以详细了解 https://www.elastic.co/guide/en/elasticsearch/c ...
- Java High Level REST Client 使用地理位置查询
Java High Level REST Client 使用地理位置查询 一.需求 二.对应的query语句 三.对应java代码 1.引入 jar 包 2.创建 RestHighLevelClien ...
- SpringBoot:elasticSearch 7.2.0 Java High Level REST Client 搜索 API
Springboot整合最新版elasticSearch参考之前的文章:SpingBoot:整合ElasticSearch 7.2.0 Search API SearchRequest用于与搜索文档, ...
随机推荐
- dotnetty 内存泄漏的BUG修复了
一.前言 当你做的产品内存不稳定,CPU不稳定,内存在600MB-3G之内波动,cpu 在30%左右,就算你对外宣传支持可以十万设备,也不会有人相信,如果你做的产品直播推流内存一直稳定在60MB左右, ...
- Economic-Assets-Allocation&Management: 资产配置+管理:标准普尔家庭资产配置图:家庭理财的科学指南
Economic-Assets-Allocation&Management: 资产配置+管理: 标准普尔家庭资产配置图:家庭理财的科学指南 发表时间:2025-05-28 10:19:43 在 ...
- 游戏技术博客推荐 Red Blob Games
https://www.redblobgames.com/ 一名专注于游戏中算法实现的大佬
- Excel: xls与xlsx格式转换排坑指南
前言 总结一下在把Excel 5.0/95 的XLS转换为Excel 2007的XLSX新格式遇到的问题. 数据类型匹配 XLS文件里的单元格是General类型,但在XLSX里,是有针对具体的列设置 ...
- vue报错-Object(...) is not a function
今天项目发现一个Vue的报错 vue报错-Object(...) is not a function 检查代码 没发现问题,因为出现这个错误是因为自己在封装的api.js里面增加了一个axios请求, ...
- C# 中,对象转JSON以及对象转JSON字符串或者反向转换
对象转JSON: 1 private void button3_Click(object sender, EventArgs e) 2 { 3 SaleOrder_Save_Main.Main SM ...
- E - Little W and Contest
https://vjudge.net/contest/386223#problem/E There are nn members in our ACM club. Little W wants to ...
- 爬虫初阶requests模块的使用
一.安装requests库 pip install requests 二.引用这个模块 import requests 三.requests的基本使用 1.发送GET请求 调用requests模块中的 ...
- Java接口和抽象类的区别(美团)
定义与语法 抽象类:使用abstract关键字定义,既能包含抽象方法(没有方法体的方法),也能包含具体方法(有方法体的方法).一个类只能继承一个抽象类. 接口:使用interface关键字定义,接口中 ...
- 从AI调用到AI智能体:全面解析三种AI应用的技术架构
一.AI应用开发的范式革命 在当今全球企业加速数字化转型的浪潮中,人工智能(AI)已不再是边缘性的技术点缀,而是深度嵌入业务流程.重塑价值创造方式的核心驱动力.我们正见证一场深刻的范式革命:AI正从单 ...