Spring Boot整合Elasticsearch 8.6启动报错:缺失JsonProvider依赖
解决Spring Boot连接Elasticsearch 8.6时的NoClassDefFoundError: jakarta/json/spi/JsonProvider错误
问题原因
该错误是因为Elasticsearch 8.x系列依赖Jakarta JSON Processing API(jakarta.json包),你的Spring Boot项目要么缺少该依赖,要么存在javax.json与jakarta.json的依赖冲突。
具体解决步骤
1. 匹配版本兼容性
- Spring Boot 3.x:天然支持Jakarta EE API,直接用官方starter即可自动适配。
- Spring Boot 2.7.x:默认使用
javax.json,需要手动替换为Jakarta版本的JSON依赖。
2. Maven依赖配置
情况1:使用Spring Boot 3.x
直接引入Spring Boot Data Elasticsearch starter,它会自动管理所有必要依赖(包括Jakarta JSON):
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-elasticsearch</artifactId> </dependency>
情况2:使用Spring Boot 2.7.x
排除Spring Boot starter中自带的javax.json-api,并引入Jakarta版本的JSON API及实现:
<!-- Spring Boot Data Elasticsearch Starter --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-elasticsearch</artifactId> <exclusions> <!-- 排除javax版本的JSON依赖 --> <exclusion> <groupId>javax.json</groupId> <artifactId>javax.json-api</artifactId> </exclusion> </exclusions> </dependency> <!-- 引入Jakarta JSON API --> <dependency> <groupId>jakarta.json</groupId> <artifactId>jakarta.json-api</artifactId> <version>2.1.1</version> </dependency> <!-- 引入Jakarta JSON的运行时实现 --> <dependency> <groupId>org.eclipse.angus</groupId> <artifactId>angus-json</artifactId> <version>1.1.4</version> <scope>runtime</scope> </dependency>
3. 清理冲突依赖
检查你的pom.xml(或build.gradle),移除任何手动引入的旧版Elasticsearch客户端依赖,比如elasticsearch-rest-high-level-client,避免与Spring Boot starter的依赖产生冲突。
4. 验证ES客户端配置
确保你的Elasticsearch配置类使用Spring Boot Data Elasticsearch 4.4+(对应ES8.x)的客户端API,示例:
import org.springframework.context.annotation.Configuration; import org.springframework.data.elasticsearch.client.ClientConfiguration; import org.springframework.data.elasticsearch.client.elc.ElasticsearchConfiguration; @Configuration public class ElasticsearchConfig extends ElasticsearchConfiguration { @Override public ClientConfiguration clientConfiguration() { return ClientConfiguration.builder() .connectedTo("localhost:9200") // ES地址 .withBasicAuth("elastic", "your-es-password") // 若开启安全认证需添加 .build(); } }
完成以上步骤后,重新构建并启动项目,即可解决该依赖缺失错误。
内容的提问来源于stack exchange,提问作者Carlos Ruiz
相关产品推荐
相关产品推荐

