我有一个使用 spring-kafka 的 Maven 项目。如果我运行 mvn dependency:tree 我得到:
....
[INFO] +- org.springframework.kafka:spring-kafka:jar:3.3.0:compile
[INFO] | +- org.springframework:spring-messaging:jar:6.1.14:compile
[INFO] | +- org.springframework:spring-tx:jar:6.1.14:compile
[INFO] | +- org.springframework.retry:spring-retry:jar:2.0.10:compile
[INFO] | \- org.apache.kafka:kafka-clients:jar:3.7.1:compile
[INFO] | +- com.github.luben:zstd-jni:jar:1.5.6-3:runtime
[INFO] | +- org.lz4:lz4-java:jar:1.8.0:runtime
[INFO] | \- org.xerial.snappy:snappy-java:jar:1.1.10.5:runtime
....
这显示了 kafka-clients 版本 3.7.1。
如果我查看 spring-kafka:3.3.0 的 pom.xml,它会显示版本 3.8.1 作为 依赖项:
<dependency>
<groupId>org.apache.kafka</groupId>
<artifactId>kafka-clients</artifactId>
<version>3.8.1</version>
<scope>compile</scope>
</dependency>
那么为什么要引入 3.7.1 版本呢?我可以提供整个依赖项:树输出。
只有 2 个依赖项将 kafka-clients 作为瞬态:spring-kafka 和 spring-kafka-test。 两者都引入 3.7.1,但在其 pom.xml 中仍将 3.8.1 作为依赖版本。
我已经运行 mvn clean install -U, dependency:resolve -U 并尝试了许多其他更新。 我尝试在我的项目中明确设置 3.8.1 作为依赖项,但由于 KafkaUtils 上的库不匹配,出现了 NoSuchMethodException。
帮助我理解为什么 maven 引入旧的依赖项而不是依赖项的 pom.xml 文件中定义的依赖项。
Spring Boot 是一个庞大的项目,与大量其他项目集成,确保所有这些不同的项目都位于可以彼此运行的兼容版本上并不是一项简单的任务。为了解决这个问题,Spring Boot 团队维护了一个 BOM,其中指定了他们已验证与每个版本的 Spring Boot 配合使用的其他项目的版本。他们记录了他们在网站上管理的每个依赖项:托管坐标。对于许多依赖项,Spring BOM 中指定的版本以外的版本都是兼容的,但一般来说,最佳实践是让 Spring BOM 管理尽可能多的版本。为了让 Spring BOM 为您管理版本,您可以请求一个省略版本的 group:artifact,并且将使用 BOM 中的默认版本。
在您的具体情况下,如果我们查看 Spring Boot 的文档,我们会发现 Spring Boot 的 3.3.x 系列使用 Kafka 的 3.7.x 系列,而 Spring Boot 的 3.4.x 系列使用 Kafka 的 3.8.x 系列默认。获取新版本 Kafka 的最佳方法是迁移到 Spring Boot 3.4.x 以确保其兼容。