Spring Boot 3.1.3与Fabric Gateway 2.2.8的OpenTelemetry版本冲突(Gradle)
解决OpenTelemetry版本冲突导致的IllegalAccessError问题
问题详情
环境与冲突现象
在Spring Boot 3.1.3项目中引入Hyperledger Fabric Gateway 2.2.8所需的OpenTelemetry时,通过gradle -q dependencies检测到存在1.29.0与1.25.0的版本冲突,部分组件被强制回退到1.25.0,最终构建时抛出以下错误:
java.lang.IllegalAccessError: class io.opentelemetry.exporter.otlp.metrics.OtlpGrpcMetricExporterBuilder tried to access method 'void io.opentelemetry.exporter.internal.grpc.GrpcExporterBuilder.<init>(java.lang.String, java.lang.String, long, java.net.URI, java.util.function.Supplier, java.lang.String)' (io.opentelemetry.exporter.otlp.metrics.OtlpGrpcMetricExporterBuilder and io.opentelemetry.exporter.internal.grpc.GrpcExporterBuilder are in unnamed module of loader 'app')
依赖树片段
| | +--- io.opentelemetry:opentelemetry-api:1.29.0 -> 1.25.0 | | | \--- io.opentelemetry:opentelemetry-context:1.25.0 | | +--- io.opentelemetry:opentelemetry-sdk:1.29.0 -> 1.25.0 | | | +--- io.opentelemetry:opentelemetry-api:1.25.0 (*) | | | +--- io.opentelemetry:opentelemetry-sdk-common:1.25.0 | | | | \--- io.opentelemetry:opentelemetry-api:1.25.0 (*) | | | +--- io.opentelemetry:opentelemetry-sdk-trace:1.25.0 | | | | +--- io.opentelemetry:opentelemetry-api:1.25.0 (*) | | | | \--- io.opentelemetry:opentelemetry-sdk-common:1.25.0 (*) | | | \--- io.opentelemetry:opentelemetry-sdk-metrics:1.25.0 -> 1.29.0 | | | +--- io.opentelemetry:opentelemetry-api:1.29.0 -> 1.25.0 (*) | | | \--- io.opentelemetry:opentelemetry-sdk-common:1.29.0 -> 1.25.0 (*) | | +--- io.opentelemetry:opentelemetry-sdk-trace:1.29.0 -> 1.25.0 (*) | | +--- io.opentelemetry:opentelemetry-exporter-otlp:1.29.0 | | | +--- io.opentelemetry:opentelemetry-sdk-trace:1.29.0 -> 1.25.0 (*) | | | +--- io.opentelemetry:opentelemetry-sdk-metrics:1.29.0 (*) | | | \--- io.opentelemetry:opentelemetry-sdk-logs:1.29.0 | | | +--- io.opentelemetry:opentelemetry-api:1.29.0 -> 1.25.0 (*) | | | \--- io.opentelemetry:opentelemetry-sdk-common:1.29.0 -> 1.25.0 (*) | | +--- io.opentelemetry:opentelemetry-extension-trace-propagators:1.29.0 -> 1.25.0 | | | \--- io.opentelemetry:opentelemetry-api:1.25.0 (*) | | +--- io.opentelemetry:opentelemetry-sdk-extension-autoconfigure:1.29.0 | | | +--- io.opentelemetry:opentelemetry-sdk:1.29.0 -> 1.25.0 (*) | | | \--- io.opentelemetry:opentelemetry-sdk-extension-autoconfigure-spi:1.29.0 -> 1.25.0 | | | \--- io.opentelemetry:opentelemetry-sdk:1.25.0 (*) | | +--- io.opentelemetry.instrumentation:opentelemetry-grpc-1.6:1.29.0-alpha | | | +--- io.opentelemetry.instrumentation:opentelemetry-instrumentation-api:1.29.0 | | | | \--- io.opentelemetry:opentelemetry-api:1.29.0 -> 1.25.0 (*) | | | +--- io.opentelemetry.instrumentation:opentelemetry-instrumentation-api-semconv:1.29.0-alpha | | | | +--- io.opentelemetry:opentelemetry-semconv:1.29.0-alpha | | | | | \--- io.opentelemetry:opentelemetry-api:1.29.0 -> 1.25.0 (*) | | | | \--- io.opentelemetry.instrumentation:opentelemetry-instrumentation-api:1.29.0 (*) | | | \--- io.opentelemetry:opentelemetry-api:1.29.0 -> 1.25.0 (*) | | \--- io.opentelemetry.proto:opentelemetry-proto:1.0.0-alpha | | \--- com.google.protobuf:protobuf-java:3.23.4
原build.gradle依赖配置
// implementation(platform("io.opentelemetry:opentelemetry-bom:1.25.0")) // implementation platform('io.opentelemetry:opentelemetry-bom-alpha:1.25.0-alpha') implementation("io.opentelemetry:opentelemetry-api") implementation('io.opentelemetry:opentelemetry-semconv') implementation('io.opentelemetry:opentelemetry-sdk-extension-autoconfigure') implementation 'io.opentelemetry:opentelemetry-api-logs:1.25.0-alpha' implementation 'io.opentelemetry:opentelemetry-sdk-metrics:1.29.0' // implementation 'io.opentelemetry:opentelemetry-exporters-otlp:0.9.1' implementation 'io.opentelemetry:opentelemetry-exporter-otlp:1.29.0' runtimeOnly 'io.opentelemetry:opentelemetry-exporter-otlp-common:1.29.0'
解决方案
1. 启用OpenTelemetry BOM统一版本管理
OpenTelemetry组件内部API耦合度高,版本必须完全一致。取消注释BOM配置,并统一使用1.29.0版本的BOM(覆盖所有组件版本):
implementation(platform("io.opentelemetry:opentelemetry-bom:1.29.0")) implementation(platform("io.opentelemetry:opentelemetry-bom-alpha:1.29.0-alpha"))
2. 移除依赖中的硬编码版本号
将所有指定了具体版本的OpenTelemetry依赖改为无版本声明,由BOM自动管控版本:
implementation("io.opentelemetry:opentelemetry-api") implementation("io.opentelemetry:opentelemetry-semconv") implementation("io.opentelemetry:opentelemetry-sdk-extension-autoconfigure") implementation("io.opentelemetry:opentelemetry-api-logs") implementation("io.opentelemetry:opentelemetry-sdk-metrics") implementation("io.opentelemetry:opentelemetry-exporter-otlp") runtimeOnly("io.opentelemetry:opentelemetry-exporter-otlp-common")
3. 强制对齐冲突依赖(可选)
如果执行gradle -q dependencies后仍存在版本回退,添加强制版本规则确保所有OpenTelemetry组件版本统一:
configurations.all { resolutionStrategy { force "io.opentelemetry:opentelemetry-api:1.29.0" force "io.opentelemetry:opentelemetry-sdk:1.29.0" force "io.opentelemetry:opentelemetry-exporter-internal-grpc:1.29.0" } }
4. 验证修复效果
执行以下命令确认所有OpenTelemetry组件版本已统一:
gradle -q dependencies | grep io.opentelemetry
内容的提问来源于stack exchange,提问作者icordoba
相关产品推荐
相关产品推荐

