You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何使kafka-clients 3.9.1与spring-kafka-test的@EmbeddedKafka兼容?

如何使kafka-clients 3.9.1与spring-kafka-test的@EmbeddedKafka兼容?

这确实是个版本兼容的坑,我来给你拆解一下问题根源和靠谱的解决办法:

问题本质分析

你遇到的两个错误其实都是版本不匹配导致的连锁反应:

  • 第一个NoSuchMethodError:你只升级了kafka-clients到3.9.1,但kafka_2.13还停留在3.8.1,两个版本的API签名不一致,导致ChannelBuilders.serverChannelBuilder方法找不到对应版本的实现。
  • 第二个NoClassDefFoundError:Kafka 3.9.0开始彻底移除了kafka.utils.TestUtils类,但你用的spring-kafka-test 3.3.x版本还在依赖这个类,自然会报找不到。

而且更关键的是,spring-kafka-test 3.3.x的官方兼容范围本来就不包含Kafka 3.9.x,这才是核心矛盾。

解决方案

1. 升级Spring Kafka到兼容Kafka 3.9.x的版本

Spring Kafka 3.4.x版本开始正式支持Kafka 3.9.x,并且已经修复了TestUtils缺失的问题,这是最稳妥的解决方案。你需要做两步:

  • spring-kafkaspring-kafka-test的版本统一升级到3.4.x(比如最新的3.4.2)
  • 确保所有org.apache.kafka相关依赖(kafka-clientskafka_2.13等)都锁定为3.9.1,避免混合版本。

举个Maven依赖的示例:

<dependency>
    <groupId>org.springframework.kafka</groupId>
    <artifactId>spring-kafka</artifactId>
    <version>3.4.2</version>
</dependency>
<dependency>
    <groupId>org.springframework.kafka</groupId>
    <artifactId>spring-kafka-test</artifactId>
    <version>3.4.2</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.apache.kafka</groupId>
    <artifactId>kafka-clients</artifactId>
    <version>3.9.1</version>
</dependency>
<dependency>
    <groupId>org.apache.kafka</groupId>
    <artifactId>kafka_2.13</artifactId>
    <version>3.9.1</version>
    <scope>test</scope>
</dependency>

2. 验证依赖一致性

升级后一定要检查依赖树,确保没有旧版本的Kafka依赖被间接引入:

  • Maven用户执行:mvn dependency:tree | grep kafka
  • Gradle用户执行:./gradlew dependencies | grep kafka
    如果发现有旧版本,需要在对应依赖里手动排除,或者调整依赖优先级。

3. 临时 workaround(不推荐)

如果暂时无法升级Spring Kafka,你可以尝试手动引入Kafka的测试模块,但这可能带来其他兼容问题:

<dependency>
    <groupId>org.apache.kafka</groupId>
    <artifactId>kafka_2.13</artifactId>
    <version>3.9.1</version>
    <classifier>test</classifier>
    <scope>test</scope>
</dependency>

不过这个方法只能临时救急,因为Spring Kafka的EmbeddedKafka逻辑和新的Kafka测试API可能不匹配,还是优先推荐升级Spring Kafka版本。

总结

最可靠的方案就是升级Spring Kafka到3.4.x版本,和Kafka 3.9.x版本完全匹配,这样既能解决方法签名不兼容的问题,也能彻底搞定TestUtils缺失的报错。

内容来源于stack exchange

火山引擎 最新活动