我需要将 OpenTelemetry 包含在 Spring Boot 3.1.3 项目中,因为 Hyperledger Fabric Gateway 2.2.8 需要它 看起来我在 OpenTelemetry 1.29.0 和 1.25.0 之间出现版本冲突,如“gradle -q dependency”命令所示:
| | +--- 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'
我在构建项目时最终遇到了这个冲突:
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.spring.dependency-management
插件,Spring Boot 将自动应用其依赖管理。此依赖项管理涵盖从 opentelemetry-bom
版本 1.25.0 开始的 Open Telemetry。通过为部分但不是全部 OpenTelemetry 依赖项指定版本,您将覆盖部分但不是全部 Spring Boot 的依赖项管理。这会让您的项目出现不兼容的版本混合。
在第一个实例中,我会尝试从所有 OpenTelemetry 依赖项中删除版本,而依赖于 Spring Boot 的依赖项管理。这应该确保所有 OpenTelemetry 依赖项与您正在使用的 Spring Boot 版本兼容。
如果删除版本不起作用并且您需要使用 OpenTelemetry 1.29.0,您可以覆盖
build.gradle
中的 OpenTelemetry 版本:
ext {
set("opentelemetry.version", "1.29.0")
}
不幸的是,这并不能保证有效,因为 OpenTelemetry 在 1.25 和 1.29 之间可能发生了重大变化,使其与 Spring Boot 3.1 不兼容。你必须尝试一下才能看到。