我的解决方法:
<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
。