在 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) 的使用中断。
有什么解决办法吗?
io.opentelemetry.api.internal.InstrumentationUtil
首次添加到此提交的 v1.41.0 中。如果您遇到运行时问题,那么您的依赖项将被降级到低于 v1.41.0 的版本,从而导致ClassNotFoundException
。从技术上讲,您可以在类路径上拥有相同依赖项的多个版本(如本例所示) ,但最终在编译主 Java 代码时,只会存在一个版本。版本冲突解决中解释了其中的逻辑。
最终,您需要确定您正在使用的所有依赖项或库的最低支持版本。您可以使用 对齐所有 OTEL 依赖项
opentelemetry-bom
,但同样,您需要找出适用于所有依赖项的正确版本。