假设我有一个项目,有2个模块和3个pom.xml文件(1个用于模块a,1个用于单元B,1个父pom.xml(
我添加了以下插件,用于验证我的变更集和另一个分支之间的代码覆盖率差异,如果低于某个阈值,则会失败https://github.com/SurpSG/diff-coverage-maven-plugin
如果我不更改代码:
mvn clean verify
->成功
mvn clean verify -T 1C -pl moduleA -am -U
->成功
mvn clean verify -T 1C -pl moduleA, moduleB -am -U
->成功
因此,正如预期的那样,我的构建正在通过,因为我没有更改代码。
现在,如果我在没有适当的单元测试代码覆盖率的情况下对moduleA进行代码更改,结果如下。
mvn clean verify -T 1C -pl moduleA -am -U
->模块B失败,跳过模块A
mvn clean verify -T 1C -pl moduleB -am -U
->成功
mvn clean verify -T 1C -pl moduleA, moduleB -am -U
->模块B失败,跳过模块A
最后一种情况让我困惑,为什么模块B会失败?为什么它没有为每个模块运行而没有副作用?
问题是,失败消息确实没有帮助,并指向错误的服务。
您正在观察一些奇怪的行为,因为插件的作者没有太多关注maven内部:
private val rootProjectDir: File
get() = reactorProjects[0].basedir
private fun collectExecFiles(): Set<File> {
return if (dataFileIncludes == null) {
setOf(dataFile)
} else {
FileUtils.getFiles(rootProjectDir, dataFileIncludes, dataFileExcludes).toSet()
}
}
注入reactorProjects
对于@aggregator
mojo是有意义的,因为当我们处理多模块项目结构并具有父子关系时,我们需要特殊处理此类情况(例如,jacoco-maven-plugin
中有两个mojo:report
和report-aggregate
(。在你的情况下,插件的作者试图用一枪杀死两只兔子,在你的特定情况下,这会导致以下情况:
当你像-pl moduleA -am
一样运行maven时,当maven执行Module B
反应堆项目是Module A, Module B
的验证阶段时,插件试图从Module A
目录中提取exec
文件,但失败了:Module A
依赖于Module B
,Module A
目录中没有exec
文件。