添加-Xshare:off参数导致Jacoco-Maven-Plugin失效问题咨询
问题背景
使用Maven 3.9.2结合Mockito执行Java 17单元测试时,出现以下JVM警告:
OpenJDK 64-Bit Server VM warning: Sharing is only supported for boot loader classes because bootstrap classpath has been appended
添加JVM参数-Xshare:off可消除该警告,但导致Jacoco无法生成执行数据文件,控制台提示:
[INFO] --- jacoco:0.8.11:report (report-unit-tests) @ commons-test ---
[INFO] Skipping JaCoCo execution due to missing execution data file.
问题解答
1. 为何添加-Xshare:off后Jacoco无法生成执行数据文件?
Jacoco的prepare-agent目标会自动向Maven Surefire/Failsafe插件的argLine参数中追加JavaAgent配置(格式为-javaagent:/path/to/jacocoagent.jar=destfile=target/jacoco.exec),用于收集测试执行数据。
但你在Surefire和Failsafe插件的配置中直接硬编码了argLine参数的值,完全覆盖了Jacoco自动追加的Agent配置。这导致Jacoco Agent未被加载,自然无法生成执行数据文件(jacoco.exec),最终报告阶段因缺少数据而跳过执行。
2. 如何在消除警告的同时正常生成覆盖率报告?
核心是保留Jacoco自动注入的Agent配置,同时添加-Xshare:off参数。修改Surefire和Failsafe插件的argLine配置,使用@{argLine}占位符引用Jacoco生成的参数,再追加-Xshare:off:
修改后的maven-surefire-plugin配置:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>3.2.1</version> <configuration> <argLine>@{argLine} -Xshare:off</argLine> <parallel>all</parallel> </configuration> </plugin>
修改后的maven-failsafe-plugin配置:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-failsafe-plugin</artifactId> <version>3.2.1</version> <configuration> <argLine>@{argLine} -Xshare:off</argLine> </configuration> <executions> <execution> <goals> <goal>integration-test</goal> <goal>verify</goal> </goals> </execution> </executions> </plugin>
验证方式:
执行mvn clean test命令后,检查模块的target目录下是否生成jacoco.exec文件;再执行mvn jacoco:report,确认覆盖率报告正常生成(默认路径为target/site/jacoco/index.html)。
对于多模块项目,确保父模块的插件配置正确被子模块继承,或在子模块中同步上述修改即可。
内容的提问来源于stack exchange,提问作者Loïc DUBOIS-TERMOZ

