Java17迁移后Jacoco+SonarQube代码覆盖率显示为0问题
解决Java17升级后Jacoco覆盖率在SonarQube显示为0的问题
核心问题分析
- Surefire插件ArgLine重复定义:你在
maven-surefire-plugin里写了两个<argLine>标签,第二个会直接覆盖第一个,导致Jacoco通过prepare-agent生成的${surefireArgLine}参数丢失,根本没生成覆盖率数据文件。 - Surefire版本过低:2.22.2版本不支持Java17,会导致测试执行时的参数传递或类加载异常。
- Sonar属性过时:使用了
sonar.jacoco.reportPath、sonar.dynamicAnalysis这些已废弃的属性,新版本SonarQube 9.9不识别,无法读取覆盖率文件。
具体修复步骤
1. 合并Surefire的ArgLine配置
把Jacoco参数、Java17模块开放参数、JVM内存参数合并到同一个<argLine>里,避免覆盖:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <!-- 升级到支持Java17的版本 --> <version>3.2.5</version> <configuration> <argLine>${surefireArgLine} --add-opens java.base/java.time=ALL-UNNAMED --add-opens java.base/java.time.format=ALL-UNNAMED --add-opens java.base/java.util=ALL-UNNAMED --add-opens java.base/java.util.stream=ALL-UNNAMED --add-opens java.base/java.lang=ALL-UNNAMED -Xms256m -Xmx2048m</argLine> <forkCount>1</forkCount> <runOrder>random</runOrder> <!-- 移除错误的destFile配置,该参数不属于Surefire插件 --> </configuration> </plugin>
2. 升级Jacoco插件版本(可选但推荐)
Jacoco 0.8.8对Java17的支持有限,建议升级到最新稳定版:
<plugin> <groupId>org.jacoco</groupId> <artifactId>jacoco-maven-plugin</artifactId> <version>0.8.11</version> <!-- 其余配置保持不变 --> </plugin>
3. 更新SonarQube属性
替换过时的属性为新版本支持的:
<!-- 替换旧的单文件路径属性为复数形式 --> <!-- <sonar.jacoco.reportPath>target/coverage-reports/jacoco-unit.exec</sonar.jacoco.reportPath> --> <sonar.jacoco.reportPaths>target/coverage-reports/jacoco-unit.exec</sonar.jacoco.reportPaths> <!-- 移除已废弃的sonar.dynamicAnalysis属性 --> <!-- <sonar.dynamicAnalysis>reuseReports</sonar.dynamicAnalysis> -->
4. 简化执行命令
不需要分开执行两次Maven命令,直接执行一次完整命令即可,避免重复clean导致覆盖率文件被删除:
mvn clean verify sonar:sonar \ -Dsonar.projectKey=test-service \ -Dsonar.host.url=http://localhost:9000 \ -Dsonar.login=sqa_57657e1f59a8f2b720badb3b7b2043e004e3832f
验证步骤
- 执行命令后,检查
target/coverage-reports/jacoco-unit.exec文件是否存在且大小不为0。 - 查看
target/site/jacoco-ut/index.html,确认本地覆盖率报告是否正常生成。 - 刷新SonarQube页面,查看覆盖率数据是否正确显示。
内容的提问来源于stack exchange,提问作者Piyush Chaudhari
相关产品推荐
相关产品推荐

