相同工件和传递依赖性的不同范围问题

时间:2012-01-19 09:37:32

标签: java maven maven-3

我有一个项目A,它使用带有测试范围的库L v1.0.0。项目A还依赖于项目B(带范围编译),B依赖于库L v1.0.0(带范围编译)。

为什么项目A的库L的最终范围是“测试”?它在运行时导致我NotClassDefFoundError。似乎项目A对库L的依赖关系定义优先于L的传递依赖关系。

这里有什么问题?我的项目A仅使用L进行单元测试,因此我使用'test'范围定义依赖项。但是,最后,我希望L在我的类路径上,因为项目A依赖于项目B进行生产,而B需要(传递)库L.

感谢您的帮助

2 个答案:

答案 0 :(得分:3)

你在使用Maven吗?在这种情况下,如果我没记错,Maven将使用“最近”定义来确定实际范围。在这种情况下,模块A指定测试,并且重写B的传递范围,因为A实际上在A中是最接近的,因为A :) 当您有多个具有依赖关系的模块时,这会变得更加复杂。 常见的解决方法是在<dependencyManagement>标记中的公共父Pom.xml中定义所有依赖项(以及范围和版本)。

答案 1 :(得分:2)

作为Peter的建议的替代方法,只需将L从A的依赖项中删除即可。无论如何,您应该能够访问它,并且Maven会将其视为compile范围内的依赖项。< / p>

这隐藏了A的测试依赖于L。