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

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

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

这有什么不对? 我的项目A仅使用L进行unit testing,因此我使用’test’范围定义依赖项。 但是,最后,我希望L在我的类路径上,因为项目A依赖于项目B进行生产,而B需要(传递性地)库L.

谢谢你的帮助

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

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

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