我使用的是mockito核心依赖版本3.6.0,使用maven作为我们的依赖管理器。我观察到,同一版本的mockito核心曾经为"obgenesis"jar 提供"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: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核心的同一版本依赖关系的范围发生了变化?
Mockito核心在compile
作用域中声明obgenesis,因为它需要它来编译。但是,当您将test
作用域中的mockito核心添加到另一个项目时,所有这些compile
作用域依赖项都将变为test
作用域。
然而,如果您在compile
作用域中的其他地方有obgenesis,并且其版本低于mockito核心,则obgenesis将返回到compile
作用域,而来自mockito内核的作用域是更高的版本,即选定的作用域。
找出谁提供了另一个对象生成的一个解决方案是从mockito核心中排除对象生成,并检查它在依赖项:树中的位置。
目的论是compile
范畴中常用的范畴。以Spring为例。您可以在runtime
作用域中添加一个显式的对象生成依赖项,以便从项目的角度获得正确的作用域。像许多其他不直接由您的项目使用的依赖项一样。但保持清洁是一项艰巨的工作。
您可以通过查看此示例项目来看到这种效果。
dependency:tree
目标的输出可能非常误导:它输出的详细信息基于Maven对已解析依赖项的内部表示,并且只列出每个依赖项一次,即使这些依赖项通过多个路径包括在内。更好的可视化是可用的,例如在您最喜欢的IDE中。
我不确定到底是什么原因导致了你的问题,但它可能与Mockito中的更改无关:如果你对模块有测试范围依赖关系,那么它的编译范围依赖关系会作为测试范围过渡地包含在你的项目中。您的问题中显示的确切配置在Maven中是不可能的(这只是dependency:tree的误导性输出(。很可能其他一些编译范围依赖也对对象生成有依赖,而其他依赖已被删除或更改,不再具有该依赖。
如果您直接依赖于依赖项,则应在适当的POM中将其声明为依赖项,而不是依赖于它被不相关的依赖项可传递地包含。您应该确保直接需要obgenesis的组件对obgenesis有编译(或运行时(范围的依赖。