当Maven测试范围的依赖项覆盖传递的编译范围依赖项时,NoClassDefFoundError

时间:2018-02-07 15:33:48

标签: java maven

我们有几个可部署的程序,并将公共代码提取到多个库中。可部署的应用程序A对库B具有(默认范围)Maven依赖关系,对库C具有测试范围的依赖关系。

我对库B进行了更改,它使用了一个方法,因此创建了对库C的依赖。这导致应用程序A在运行时使用NoClassDefFoundErrors失败。当然,App A的单元测试全部通过,所以我们只在我们的临时环境中找到了它。 (其他应用程序要么没有直接依赖库C,要么对它有默认范围的依赖关系,因此继续工作。)

当然,显而易见的解决方法是:我编辑了一个pom.xml来依赖C默认范围。

我的问题是:我们做错了吗?或者这是事情应该如何运作?是否有人意识到在构建时检测潜在问题并使构建失败的自动方法?

1 个答案:

答案 0 :(得分:1)

你没有做错事。 Maven在这里做出了独特的设计选择。另见

Maven: test vs. transitive compile,特别是Tunakis对我的问题发表评论。

Maven dependency within dependency with different scope

我的建议:从A&#tom.xml中删除C语言。如果依赖关系树上尚未存在这些依赖关系,则仅添加测试依赖关系。