升级Kafka至3.4.0导致EmbeddedKafka单元测试崩溃
核心原因
Kafka 3.x版本中,kafka.common.KafkaException类已迁移至org.apache.kafka.common.KafkaException包路径。你遇到的ClassNotFoundException本质是Spring Kafka测试组件(spring-kafka-test)与kafka-clients 3.4.0版本不兼容,导致测试代码仍在尝试加载旧包路径的类。
分步解决方案
1. 确认Spring Boot版本兼容性
Kafka 3.4.0需要搭配Spring Boot 2.7.x及以上版本使用,先检查你的pom.xml中spring-boot-starter-parent的版本,如果低于2.7.x,必须先升级Spring Boot版本,否则依赖匹配会出现问题。
2. 统一Spring Kafka与Kafka客户端版本
仅设置kafka.version不足以保证Spring Kafka组件与Kafka客户端的版本匹配,需要同时指定spring-kafka.version属性,两者对应关系如下(以兼容Kafka 3.4.0为例):
<properties> <kafka.version>3.4.0</kafka.version> <!-- Spring Kafka 2.9.x 对应 Kafka 3.4.x --> <spring-kafka.version>2.9.10</spring-kafka.version> </properties>
3. 排查并排除依赖冲突
执行mvn dependency:tree命令,检查输出中是否存在旧版本的kafka相关依赖(比如kafka-clients、kafka_2.13等),尤其是第三方依赖(例如你的streaming-commons)可能引入的旧版依赖。如果发现冲突,在对应依赖中添加排除规则:
<dependency> <groupId>com.sap.etd.cloud</groupId> <artifactId>streaming-commons</artifactId> <version>1.21.0</version> <exclusions> <exclusion> <groupId>org.apache.kafka</groupId> <artifactId>kafka-clients</artifactId> </exclusion> <exclusion> <groupId>org.apache.kafka</groupId> <artifactId>kafka_2.13</artifactId> </exclusion> </exclusions> </dependency>
4. 确保spring-kafka-test版本正确
无需手动指定spring-kafka-test的版本,只要通过上述spring-kafka.version属性统一管理,Spring Boot会自动匹配对应版本的测试组件,避免版本不一致。
5. 清理Maven缓存并重新构建
执行以下命令清理本地缓存并强制更新依赖,避免缓存的旧依赖干扰:
mvn clean install -U
额外检查点
- 你的
pom.xml中手动指定了多个Tomcat构件版本,建议移除这些手动版本,交由Spring Boot的父依赖统一管理,避免其他依赖冲突。 - 确认所有使用
@EmbeddedKafka的测试类中,没有硬编码依赖旧版Kafka的API或配置。
内容的提问来源于stack exchange,提问作者Raul Mureșan

