Spring Boot测试报NoClassDefFoundError:AlterPartitionRequest$Builder缺失
使用Spring Boot 2.7.18版本,搭配以下依赖:
artifact = "spring-kafka-test", group = "org.springframework.kafka", version = 2.9.3, artifact = "scala-library", group = "org.scala-lang", version = "2.13.13"
运行测试时出现加载ApplicationContext失败的错误,根源为java.lang.NoClassDefFoundError: org/apache/kafka/common/requests/AlterPartitionRequest$Builder,相关堆栈信息如下:
Failed to load ApplicationContext java.lang.IllegalStateException: at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:98) ... Caused by: java.lang.NoClassDefFoundError: org/apache/kafka/common/requests/AlterPartitionRequest$Builder at kafka.server.KafkaServer.startup(KafkaServer.scala:320) ...
已尝试更换多个版本但未解决问题,寻求可行解决方案。
这个错误的核心原因是Kafka客户端与Spring Kafka、Spring Boot版本不兼容,AlterPartitionRequest$Builder是特定Kafka客户端版本才包含的类,Spring Boot对生态依赖有严格的版本适配规则,以下是具体解决步骤:
统一依赖版本,使用Spring Boot的依赖管理
Spring Boot 2.7.18默认适配的Spring Kafka版本为2.9.x,对应的Kafka客户端版本是3.1.x。移除spring-kafka-test的手动版本声明,让Spring Boot自动管理版本,避免版本错位:artifact = "spring-kafka-test", group = "org.springframework.kafka"若需显式声明
kafka-clients,需指定为3.1.x系列(如3.1.2),确保与Spring Boot版本匹配。校验Scala版本兼容性
Spring Kafka 2.9.x适配Scala 2.13.x,你当前使用的2.13.13符合要求,但需确保测试用EmbeddedKafka依赖的Scala版本与scala-library一致,可通过依赖分析工具确认是否存在版本冲突。排查并排除依赖冲突
执行依赖分析命令(Maven:mvn dependency:tree;Gradle:./gradlew dependencies),找出是否有其他依赖引入了不一致的kafka-clients或scala-library版本,通过排除规则移除冲突依赖:
示例Gradle排除配置:configurations.all { exclude group: 'org.apache.kafka', module: 'kafka-clients', version: '冲突版本号' }清理缓存并重新构建
删除本地依赖缓存(Maven:.m2/repository;Gradle:.gradle/caches),重新执行构建命令,确保所有依赖都加载为适配版本。
内容的提问来源于stack exchange,提问作者Aditya Setia

