You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 21:53:26