我们有多个可部署项,并将通用代码提取到多个库中。可部署应用程序 A 具有对库 B 的(默认范围的)Maven 依赖项,以及对库 C 的测试范围的依赖项。
我对库 B 进行了更改,它使用了库 C 的方法,因此创建了对库 C 的依赖。这导致应用程序 A 在运行时因 NoClassDefFoundErrors 而失败。 App A 的单元测试当然都通过了,所以我们只在我们的暂存环境中发现了这一点。 (其他应用程序要么不直接依赖库 C,要么对它有默认范围的依赖,因此可以继续工作。)
当然,明显的修复工作了:我编辑了 A 的 pom.xml 以依赖于 C 默认范围。
我的问题是:我们做错了什么吗?或者这是事情应该如何运作?有人知道在构建时检测潜在问题并使构建失败的自动化方法吗?
最佳答案
你没有做错什么。 Maven 在这里做了一个特殊的设计选择。另见
Maven: test vs. transitive compile ,尤其是 Tunakis 对我的问题的评论。
和
Maven dependency within dependency with different scope
我的建议:从 A 的 pom.xml 中删除 C。仅当这些依赖项不在依赖项树上时才添加测试依赖项。
关于java - NoClassDefFoundError 当 Maven 测试范围的依赖覆盖传递编译范围的依赖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48667593/