java - NoClassDefFoundError 当 Maven 测试范围的依赖覆盖传递编译范围的依赖

标签 java maven

我们有多个可部署项,并将通用代码提取到多个库中。可部署应用程序 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/

相关文章:

java - Jersey 1.x 到 2.x : simple web. xml 更改,惨败

java - Maven - 无法使用 Maven 模板创建项目

带有 git 子模块的 Android Maven IntelliJ 项目

java - 有人使用 JavaSpaces 技术吗?

java - 如何清理死代码/无用代码

java - Java内置库中的两个链接如何链接在一起?

maven - 如何从JUnit测试读取Maven属性?

maven - 运行 mvn clean install 时不要运行集成测试

java - 从java中的另一个类中删除arraylist中的指定对象

java.sql.SQLException : Field 'id' doesn't have a default value 异常