Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java NoClassDefFoundError当Maven测试范围的依赖项覆盖可传递的编译范围的依赖项时_Java_Maven - Fatal编程技术网

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

Java NoClassDefFoundError当Maven测试范围的依赖项覆盖可传递的编译范围的依赖项时,java,maven,Java,Maven,我们有几个可部署的,并已将公共代码提取到几个库中。可部署应用程序A对库B有一个(默认范围的)Maven依赖项,对库C有一个测试范围的依赖项 我对库B做了一个更改,它使用了库C中的一个方法,因此创建了对库C的依赖关系。这导致应用程序a在运行时出现NoClassDefFoundErrors失败。当然,appa的单元测试都通过了,所以我们只在登台环境中发现了这一点。(其他应用程序要么对库C没有直接依赖关系,要么对库C有默认范围的依赖关系,因此可以继续工作。) 当然,显而易见的修复是有效的:我编辑了A的

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

我对库B做了一个更改,它使用了库C中的一个方法,因此创建了对库C的依赖关系。这导致应用程序a在运行时出现NoClassDefFoundErrors失败。当然,appa的单元测试都通过了,所以我们只在登台环境中发现了这一点。(其他应用程序要么对库C没有直接依赖关系,要么对库C有默认范围的依赖关系,因此可以继续工作。)

当然,显而易见的修复是有效的:我编辑了A的pom.xml,使对C的依赖成为默认范围


我的问题是:我们做错什么了吗?或者这就是事情的运作方式?有人知道在构建时自动检测潜在问题并导致构建失败的方法吗?

您没有做错什么。Maven在这里做出了一个独特的设计选择。另见

,特别是Tunkis对我的问题的评论


我的建议是:从A的pom.xml中删除C。只有在依赖关系树上没有这些依赖关系时才添加测试依赖关系。

从C导入类而不是在pom中声明C,而是依赖于从可传递依赖关系中提取它,这确实令人困惑。我会将“测试”定义为在非测试代码运行时完全忽略的作用域,但他们选择了所有直接作用域覆盖可传递作用域。因此在我们的例子中,a对C的测试依赖性先于a对B的依赖性,两者都先于B对C的依赖性。最后一个更改在运行时破坏了我们的工作。作为后续问题:有人知道在构建时自动检测潜在问题的方法吗?