如何使用 gradle 对 io.opentelemetry 的瞬态依赖项进行版本控制?

问题描述 投票:0回答:1

在 gradle 中过滤传递依赖关系有多详细? 我正在与 jvm-classpath 进行斗争。在运行时,我们遇到 java.lang.ClassNotFoundException: io.opentelemetry.api.internal.InstrumentationUtil

这个类应该在 opentelemetry-instrumentation-api 中?在什么版本中删除或添加了它?

io.opentelemtry 组有许多子模块,我们的构建中有数百个不同的依赖项。因此,不可能强制使用特定版本,因为这将导致许多依赖项被破坏。

有没有办法对传递依赖项强制进行版本控制? 例如:

  • 模块 a 依赖于模块 b
  • 模块 b 对模块 c 有暂时依赖,而模块 c 又依赖于 io.opentelemtry:*:2.7.0
  • 模块 b 对模块 d 也有一个暂时的依赖,而模块 d 又依赖于 io.opentelemtry:*:1.37.0

问题: 我不能对依赖项(模块 b)设置使用版本 2.7.0 的约束,因为这会导致暂时依赖项(模块 d)的使用中断。另一方面,我不能对依赖项(模块 b)进行限制,即使用版本 1.37.0,因为这将导致临时依赖项(模块 c)的使用中断。

有什么解决办法吗?

gradle
1个回答
0
投票

这个类应该在 opentelemetry-instrumentation-api 中?在什么版本中删除或添加了它?

io.opentelemetry.api.internal.InstrumentationUtil
首次在 v1.41.0 的 this 提交中添加。如果您遇到运行时问题,那么您的依赖项将被降级到低于 v1.41.0 的版本,从而导致
ClassNotFoundException

有什么方法可以强制传递依赖项的版本控制吗?

从技术上讲,您可以在类路径上拥有相同依赖项的多个版本,如this所示,但最终在编译主 Java 代码时,只会出现一个版本。其逻辑在版本冲突解决中进行了解释。

最终,您需要确定您正在使用的所有依赖项或库的最低受支持版本。您可以使用

opentelemetry-bom
对齐所有 OTEL 依赖项,但您再次需要找出适用于所有人的正确版本。

dependencies {
    implementation(enforcedPlatform("io.opentelemetry:opentelemetry-bom:1.43.0"))
}
© www.soinside.com 2019 - 2024. All rights reserved.