使用spring-kafka-test的@EmbeddedKafka报Scala类找不到异常如何解决
问题根因
这个异常是Scala版本不兼容导致的,你手动声明的Kafka服务端依赖、Scala库依赖和spring-kafka-test内置的嵌入式Kafka依赖版本冲突,不同Scala版本中集合转换类的包路径发生了变更,所以找不到scala.collection.convert.AsJavaExtensions类。
修复步骤
直接修改你的build.gradle.kts依赖配置,删除两处不必要的手动依赖声明即可:
- 删除手动引入的Kafka服务端依赖:
implementation(group = "org.apache.kafka", name = "kafka_2.12", version = "2.8.0")
你不需要主动声明Kafka服务端依赖,spring-kafka-test的@EmbeddedKafka会自动引入和当前Spring Kafka版本完全匹配的嵌入式Kafka依赖,手动指定反而会造成版本冲突。 - 删除手动引入的Scala库依赖:
implementation(group = "org.scala-lang", name = "scala-library", version = "2.12.10")
嵌入式Kafka会自动传递对应版本的Scala库依赖,手动指定版本会打断传递依赖的版本匹配规则。
修改后的依赖配置参考:
dependencies { implementation(group = "org.springframework.kafka", name = "spring-kafka", version = "2.7.6") implementation(group = "org.springframework.boot", name = "spring-boot-starter-web") implementation(group = "org.jetbrains.kotlin", name = "kotlin-reflect") testImplementation(group = "org.springframework.boot", name = "spring-boot-starter-test") testImplementation(group = "org.springframework.kafka", name = "spring-kafka-test", version = "2.7.6") testImplementation(group = "org.testcontainers", name = "kafka", version = "1.16.0") testImplementation(group = "org.jetbrains.kotlin", name = "kotlin-test-junit") }
修改后重新执行测试即可正常运行。如果修改后仍有版本冲突,可以在Gradle配置中强制指定Scala库版本和Kafka的Scala编译版本对齐即可。
可选优化
如果你后续打算使用Testcontainers做Kafka集成测试,可以直接去掉@EmbeddedKafka注解,不需要依赖嵌入式Kafka,也能避免类似的Scala版本冲突问题。
内容的提问来源于stack exchange,提问作者Tobias Hermann
相关产品推荐
相关产品推荐

