Quarkus与Spring框架类加载冲突问题求助
问题:Quarkus Kafka与CXF客户端项目单元测试类加载冲突
- 项目场景:正在做Quarkus集成Kafka + CXF客户端的测试项目,单元测试中用到Spring Kafka的
EmbeddedKafkaBroker、KafkaTestUtils,同时用quarkus-cxf依赖实现SOAP Web服务调用 - 遇到的问题:运行单元测试时触发类加载约束违反错误;尝试排除
spring-core依赖后,又出现新的类加载冲突;配置quarkus.class-loading.removed-resources也无法解决
报错信息
初始报错
Runtime java.lang.RuntimeException: io.quarkus.builder.BuildException: Build failure: Build failed due to errors [error]: Build step io.quarkiverse.cxf.deployment.QuarkusCxfProcessor#bus threw an exception: java.lang.LinkageError: loader constraint violation: loader io.quarkus.bootstrap.classloading.QuarkusClassLoader @1ad4ff2a wants to load interface org.springframework.core.io.Resource. A different interface with the same name was previously loaded by 'app'. (org.springframework.core.io.Resource is in unnamed module of loader 'app')
排除spring-core后报错
loader constraint violation: when resolving method 'void org.springframework.core.log.LogAccessor. <init>(org.apache.commons.logging.Log)' the class loader io.quarkus.bootstrap.classloading.QuarkusClassLoader @59f59a0a of the current class, org/springframework/kafka/test/EmbeddedKafkaKraftBroker, and the class loader 'app' fo r the method's defining class, org.springframework.core.log.LogAccessor, have different Class objects for the type org/apache/commons/logging/Log used in the signature (org.springframework.kafka.test.EmbeddedKafkaKraftBroker is in unnamed module of loader io.quarkus.bootstrap.classloading.QuarkusClassLoader @59f59a0a, parent loader 'app'; org.springframework.core.log.LogAccessor is in unnamed module of loader 'app')
解决方案建议
1. 规范Spring测试依赖的作用范围与依赖排除
把Spring Kafka测试依赖限定在test作用域,并排除可能引发冲突的传递依赖(比如spring-core、commons-logging),避免这些类被Quarkus的类加载器重复加载。以Maven为例:
<dependency> <groupId>org.springframework.kafka</groupId> <artifactId>spring-kafka-test</artifactId> <scope>test</scope> <exclusions> <exclusion> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> </exclusion> <exclusion> <groupId>org.apache.commons.logging</groupId> <artifactId>commons-logging</artifactId> </exclusion> </exclusions> </dependency>
2. 配置Quarkus类加载器优先使用父类加载器
在application.properties中添加类加载配置,让Spring、commons-logging相关包强制从父类加载器(即报错中的'app'加载器)加载,避免类加载器隔离导致的重复类问题:
quarkus.class-loading.parent-first-artifacts=org.springframework,org.apache.commons.logging
3. 替换Spring Kafka测试组件为Quarkus原生方案
如果上述配置仍无法解决冲突,建议直接使用Quarkus官方提供的Kafka测试扩展替代Spring的EmbeddedKafka,比如quarkus-kafka-streams-test或quarkus-smallrye-reactive-messaging-kafka的测试依赖,从根源避免Spring与Quarkus的类加载体系冲突。
4. 清理重复依赖
用依赖分析工具排查项目中的重复依赖,统一冲突包的版本:
- Maven执行:
mvn dependency:tree - Gradle执行:
./gradlew dependencies
根据输出结果,手动排除冗余的spring-core、commons-logging等依赖,确保整个项目中这些依赖只有一个版本。
内容的提问来源于stack exchange,提问作者sonia belhadj
相关产品推荐
相关产品推荐

