我有一个项目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.
感谢您的帮助
答案 0 :(得分:3)
你在使用Maven吗?在这种情况下,如果我没记错,Maven将使用“最近”定义来确定实际范围。在这种情况下,模块A指定测试,并且重写B的传递范围,因为A实际上在A中是最接近的,因为A :)
当您有多个具有依赖关系的模块时,这会变得更加复杂。
常见的解决方法是在<dependencyManagement>
标记中的公共父Pom.xml中定义所有依赖项(以及范围和版本)。
答案 1 :(得分:2)
作为Peter的建议的替代方法,只需将L从A的依赖项中删除即可。无论如何,您应该能够访问它,并且Maven会将其视为compile
范围内的依赖项。< / p>
这隐藏了A的测试依赖于L。