Quarkus 3.8集成CXF OpenTelemetry出现依赖缺失错误求助
1. 版本兼容性不匹配
Quarkus 3.8.6 LTS 对应的 quarkus-cxf-integration-tracing-opentelemetry 扩展存在版本适配问题:该扩展在这个Quarkus版本下,依赖的OpenTelemetry API/实现版本与Quarkus BOM中定义的版本不一致,导致无法找到可注入的 io.opentelemetry.api.OpenTelemetry 实例。
2. 核心依赖缺失
quarkus-cxf-integration-tracing-opentelemetry 本身不提供OpenTelemetry的核心实现,它依赖 quarkus-opentelemetry 扩展来提供可注入的 OpenTelemetry bean。如果项目中没有显式引入 quarkus-opentelemetry 依赖,降级Quarkus BOM后就会出现依赖缺失的情况。
3. 扩展初始化顺序问题
Quarkus 3.8.6 的扩展初始化逻辑有调整,导致CXF tracing扩展尝试注入 OpenTelemetry 实例时,OpenTelemetry扩展还未完成bean的初始化,最终触发依赖解析失败。
指定兼容的CXF扩展版本:查找与Quarkus 3.8.6 LTS匹配的
quarkus-cxf-integration-tracing-opentelemetry版本,在pom.xml中显式声明该版本,避免依赖传递带来的版本不匹配:<dependency> <groupId>io.quarkiverse.cxf</groupId> <artifactId>quarkus-cxf-integration-tracing-opentelemetry</artifactId> <version>[兼容Quarkus 3.8.6的版本号]</version> </dependency>添加OpenTelemetry核心依赖:确保项目中引入
quarkus-opentelemetry依赖,为CXF扩展提供所需的OpenTelemetrybean:<dependency> <groupId>io.quarkus</groupId> <artifactId>quarkus-opentelemetry</artifactId> </dependency>排查并解决依赖冲突:执行
mvn dependency:tree命令分析依赖树,找出OpenTelemetry相关依赖的版本冲突,通过<exclusions>排除不兼容的版本,强制使用Quarkus 3.8.6 BOM中定义的版本:<dependency> <groupId>io.quarkiverse.cxf</groupId> <artifactId>quarkus-cxf-integration-tracing-opentelemetry</artifactId> <exclusions> <exclusion> <groupId>io.opentelemetry</groupId> <artifactId>opentelemetry-api</artifactId> </exclusion> </exclusions> </dependency>手动提供OpenTelemetry bean:如果默认初始化逻辑失效,可通过自定义Producer手动创建
OpenTelemetry实例:import io.opentelemetry.api.OpenTelemetry; import io.opentelemetry.sdk.OpenTelemetrySdk; import jakarta.enterprise.context.ApplicationScoped; import jakarta.enterprise.inject.Produces; @ApplicationScoped public class OpenTelemetryProducer { @Produces public OpenTelemetry produceOpenTelemetry() { return OpenTelemetrySdk.builder().buildAndRegisterGlobal(); } }
内容的提问来源于stack exchange,提问作者godo57

