我使用mockito核心依赖版本3.6.0,使用maven作为我们的依赖管理器。我观察到,相同版本的mockito-core为“objenesis”jar提供了“编译”依赖范围。
+- org.mockito:mockito-core:jar:3.6.0:test
[INFO] | +- net.bytebuddy:byte-buddy:jar:1.10.11:test
[INFO] | +- net.bytebuddy:byte-buddy-agent:jar:1.10.11:test
[INFO] | \- org.objenesis:objenesis:jar:3.1:compile但突然之间,它将范围改为“测试”,用于“讣告”。
+- org.mockito:mockito-core:jar:3.6.0:test
[INFO] | +- net.bytebuddy:byte-buddy:jar:1.10.11:test
[INFO] | +- net.bytebuddy:byte-buddy-agent:jar:1.10.11:test
[INFO] | \- org.objenesis:objenesis:jar:3.1:test这显然给我们的应用程序中的依赖注入带来了重大问题,因为我们使用cglib为bean创建代理。
是什么导致了同一个版本依赖于mockito核心的范围的改变呢?
发布于 2022-01-21 01:28:03
Mockito在compile范围内声明objenesis,因为它需要它来编译。但是,当您将test作用域中的mockito添加到另一个项目时,所有这些compile作用域依赖关系都变成了test作用域。
但是,如果您在compile范围内的其他地方有objenesis,并且在比mockito内核低的版本中,objenesis将返回到compile范围,而来自mockito的对象是一个更高的版本,这就是所选的版本。
找出是谁提供了另一个讣告的解决方案之一,就是从mockito核中排除objenesis,并检查它出现在依赖项中的位置:tree。
在compile范围内,Objenesis是经常使用的。比如春天。您可以在runtime作用域中添加一个显式的objenesis依赖项,以便从项目的角度获得正确的范围。与许多其他依赖项一样,您的项目没有直接使用。但保持清洁是一项很大的工作。
通过查看这个样本工程,您可以看到这种效果。
发布于 2022-01-20 10:20:42
来自dependency:tree目标的输出可能非常误导:它的输出细节基于Maven对已解析的依赖项的内部表示,并且只列出每个依赖项一次,即使这些依赖项是通过多条路径包含的。更好的可视化是可用的,例如在您最喜欢的IDE中。
我不清楚到底是什么原因导致了您的问题,但这可能与Mockito中的更改无关:如果您对模块具有测试范围依赖关系,那么它的编译范围依赖项将作为测试-scope临时包含到您的项目中。在Maven中所显示的精确配置是不可能的(它只是来自dependency:tree的误导性输出)。其他编译范围依赖项可能也依赖于objenesis,而另一个依赖项已被移除或更改,并且不再具有该依赖项。
如果直接依赖于依赖项,则应在适当的POM中将其声明为依赖项,而不是依赖于由无关依赖项临时包含的依赖项。您应该确保无论哪个组件需要objenesis,直接对objenesis具有编译(或运行时)作用域依赖。
https://stackoverflow.com/questions/70767694
复制相似问题