You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java17迁移后Jacoco+SonarQube代码覆盖率显示为0问题

解决Java17升级后Jacoco覆盖率在SonarQube显示为0的问题

核心问题分析

  1. Surefire插件ArgLine重复定义:你在maven-surefire-plugin里写了两个<argLine>标签,第二个会直接覆盖第一个,导致Jacoco通过prepare-agent生成的${surefireArgLine}参数丢失,根本没生成覆盖率数据文件。
  2. Surefire版本过低:2.22.2版本不支持Java17,会导致测试执行时的参数传递或类加载异常。
  3. 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

验证步骤

  1. 执行命令后,检查target/coverage-reports/jacoco-unit.exec文件是否存在且大小不为0。
  2. 查看target/site/jacoco-ut/index.html,确认本地覆盖率报告是否正常生成。
  3. 刷新SonarQube页面,查看覆盖率数据是否正确显示。

内容的提问来源于stack exchange,提问作者Piyush Chaudhari

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 08:30:01