ClassNotFoundException: com.fasterxml.jackson.core.util.JacksonFeature in Spring boot, elasticsearch
使用dependencyManagement覆盖SpringBoot原有版本即可。我想用 Elasticsearch 的新 Java API 客户端替换已经废弃的 High Level Rest Client。问题是,我不确定我的依赖项配置是否正确!Elasticsearch 刚刚升级到7.17.3,SpringBoot 现在是2.2.8,稍后会升级,但我不确定这是否是问题所在?我在这里参考了所以
我的解决方法:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.17.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.17.0</version>
</dependency>
<dependency>
<groupId>jakarta.json</groupId>
<artifactId>jakarta.json-api</artifactId>
<version>2.0.1</version>
</dependency>
</dependencies>
</dependencyManagement>
使用 dependencyManagement 覆盖SpringBoot原有版本即可。
原文链接ClassNotFoundException: com.fasterxml.jackson.core.util.JacksonFeature in Spring boot, upgrading from Elasticsearch HLRC to Java API Client
我想用 Elasticsearch 的新 Java API 客户端替换已经废弃的 High Level Rest Client。问题是,我不确定我的依赖项配置是否正确!我遇到了这个错误:
java.lang.NoClassDefFoundError: com/fasterxml/jackson/core/util/JacksonFeature
Caused by: java.lang.ClassNotFoundException: com.fasterxml.jackson.core.util.JacksonFeature
Elasticsearch 刚刚升级到7.17.3,SpringBoot 现在是2.2.8,稍后会升级,但我不确定这是否是问题所在?以下是我在pom中的依赖关系:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springdoc</groupId>
<artifactId>springdoc-openapi-webmvc-core</artifactId>
</dependency>
<dependency>
<groupId>org.springdoc</groupId>
<artifactId>springdoc-openapi-data-rest</artifactId>
</dependency>
<dependency>
<groupId>org.springdoc</groupId>
<artifactId>springdoc-openapi-security</artifactId>
</dependency>
<dependency>
<groupId>org.springdoc</groupId>
<artifactId>springdoc-openapi-ui</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>co.elastic.clients</groupId>
<artifactId>elasticsearch-java</artifactId>
<version>7.17.3</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.13.2</version>
</dependency>
<dependency>
<groupId>jakarta.json</groupId>
<artifactId>jakarta.json-api</artifactId>
<version>2.1.0</version>
</dependency>
</dependencies>
我在这里参考了 Elasticsearch here 所以我也试用了 jackson-database 的2.12.3版本,但是错误依然存在。有什么应该改变的想法吗?谢谢!
编辑: 为了以防万一,这里还有我的客户端,它是需要依赖关系的地方(我假设)
@Configuration
public class ElasticsearchClient{
RestClient restClient = RestClient.builder(new HttpHost("localhost", 9200)).build();
ElasticsearchTransport transport = new RestClientTransport(restClient, new JacksonJsonpMapper());
public ElasticsearchClient client = new ElasticsearchClient(transport);
}
(我不得不把public放在client面前,因为它位于另一个包裹之下,不然无法调用)
看了更多信息后: 原来有一个parent,它将加载一个旧的jackson-databind,所以我做了以下(为了解决版本冲突的问题,排除parent特定的jackson-databind版本,然后显式地添加另一个版本的jackson-databind作为依赖。)
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-schema-registry-client</artifactId>
<exclusions>
<exclusion>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.12.3</version>
</dependency>
还是没用,所以我现在200%没主意了
添加一个 jackson-core 包解决了。(jackson-core和jackson-databind版本一致)
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.12.3</version>
</dependency>
下面这是我自己的依赖:添加了与jackson-databind版本一致的 jackson-core 2.17.0版本

官网上是这样说的:
如果出现 ClassNotFoundException:jakarta.json.spi.JsonProvider
设置依赖项后,您的应用程序可能会失败ClassNotFoundException: jakarta.json.spi.JsonProvider。
如果发生这种情况,您必须明确添加jakarta.json:jakarta.json-api:2.0.1依赖项。
为什么需要这样做?
Spring Boot 或 Helidon 等一些框架附带 Gradle 和 Maven 插件或 Maven BOM 文件,以简化开发和依赖项管理。这些插件和 BOM 定义了许多知名库要使用的版本。
其中一个库可以jakarta.json:json-api定义标准 Java JSON API。在 2010 版中,1.x该库使用了javax.json包,而在 2011 版中,2.x它使用了从 JavaEE 过渡到 JakartaEEjakarta.json后的 包。
Java API 客户端依赖2.0.1于此库的版本,以便使用较新且面向未来的jakarta.json软件包。但某些构建插件和 BOM 会覆盖 Java API 客户端的依赖关系,以使用1.x较旧命名空间中的版本javax.json,从而导致ClassNotFoundException: jakarta.json.spi.JsonProvider。
添加正确的版本作为顶级项目依赖项可以解决问题。
如果你的应用程序也需要javax.json你可以添加javax.json:javax.json-api:1.1.4依赖项,这相当于jakarta.json:jakarta.json-api:1.1.6。
原因:github仓库里可以看到这个类是在2.12版本之后

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐



所有评论(0)