Maven添加报告插件后process-classes阶段绑定的exec-maven-plugin重复执行问题
问题根本原因
Maven 3.x的报告生成机制中,默认<reporting>标签下配置的每一个报告插件都会独立触发一次完整的构建生命周期,所以你配置了N个报告插件,绑定在构建阶段的任务就会执行N+1次(1次是install命令触发的主构建,N次是每个报告插件单独触发的构建),这就是你配置2个surefire报告插件时test.Runner总共执行3次的原因。
解决方案
方案1:统一报告插件配置(最直接)
把所有报告插件的配置从<reporting>标签挪到maven-site-plugin的<reports>节点下统一管理,所有报告只会触发一次生命周期执行,避免重复构建。
修改后的maven-site-plugin配置示例:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-site-plugin</artifactId> <version>3.9.1</version> <configuration> <reports> <!-- 所有报告都在此处配置,不需要单独在reporting标签下声明 --> <report>surefire-report:report</report> <report>surefire-report:report-only</report> <!-- 新增其他报告直接添加对应report节点即可 --> </reports> </configuration> </plugin>
配置完成后删除原有的<reporting>整块标签即可。
方案2:开启Maven构建缓存(通用推荐)
Maven 3.5+原生支持构建缓存功能,开启后会自动检测任务的输入输出是否发生变化,没有变化的情况下直接跳过重复执行,不需要修改原有插件配置。
在pom的<build>节点下添加如下配置即可:
<build> <cache> <enabled>true</enabled> <hashAlgorithm>SHA-256</hashAlgorithm> </cache> <!-- 原有build下的其他配置保持不变 --> </build>
方案3:添加任务执行标记
如果需要兼容旧版本Maven,可以通过自定义属性标记任务是否已经执行,后续触发时直接跳过。
- 先在
<properties>节点添加默认属性:
<properties> <runner.executed>false</runner.executed> <!-- 原有其他属性保持不变 --> </properties>
- 修改
exec-maven-plugin配置,添加跳过逻辑,同时配合build-helper-maven-plugin执行完成后修改标记属性:
<plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>exec-maven-plugin</artifactId> <executions> <execution> <phase>process-classes</phase> <id>${main.class}</id> <goals> <goal>java</goal> </goals> <configuration> <mainClass>${main.class}</mainClass> <skip>${runner.executed}</skip> </configuration> </execution> </executions> </plugin> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>build-helper-maven-plugin</artifactId> <version>3.3.0</version> <executions> <execution> <id>mark-runner-executed</id> <phase>process-classes</phase> <goals> <goal>set-property</goal> </goals> <configuration> <name>runner.executed</name> <value>true</value> </configuration> </execution> </executions> </plugin>
内容的提问来源于stack exchange,提问作者JackPGreen
相关产品推荐
相关产品推荐

