如何使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-kafka和spring-kafka-test的版本统一升级到3.4.x(比如最新的3.4.2) - 确保所有
org.apache.kafka相关依赖(kafka-clients、kafka_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




