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

Maven配置JaCoCo后SonarQube显示代码覆盖率为0%问题咨询

SonarQube JaCoCo 覆盖率显示0% 排查方案

问题1:Maven命令执行顺序错误

Maven 严格按照命令中书写的顺序执行生命周期阶段和插件目标,你当前命令将 org.jacoco:jacoco-maven-plugin:prepare-agent 写在 install 阶段之后,意味着整个构建、测试流程全部执行完成后,才会运行JaCoCo agent挂载逻辑,测试JVM启动时根本没有注入覆盖率采集探针,自然无法生成有效覆盖率数据。
另外你手动在命令行指定的prepare-agent是无自定义配置的默认目标,会覆盖profile中绑定了生命周期、配置了独立ut/it输出路径的prepare-agent执行逻辑,最终只会生成无有效数据的默认jacoco.exec文件,你配置的jacoco-ut.exec要么不存在,要么是空文件。

修复方案

  • 删除命令行中额外追加的org.jacoco:jacoco-maven-plugin:prepare-agent,profile中已经将prepare-agent绑定到了对应生命周期阶段,激活profile后构建到对应phase会自动执行。
  • 移除无效参数-Djacoco.outputDir=${WORKSPACE}/target,JaCoCo插件不识别该配置项,输出路径已经在pom中通过destFile指定。
  • 修正后的基础命令如下,注意不要随意换行,换行需在末尾加\(Linux)或^(Windows)续行:
mvn clean install -Pcoverage -Dmaven.test.failure.ignore=true

问题2:版本不兼容+配置过时

你当前使用的jacoco-maven-plugin 0.7.4.201502262128、sonar-jacoco-listeners 1.5都是2015年的老旧版本,存在两个核心兼容问题:

  1. 生成的exec二进制文件格式过旧,SonarQube 7.9+内置的SonarJava插件无法正常解析,会直接判定无覆盖率数据。
  2. 老旧的listener不支持JUnit 4.12+、JUnit5,无法在测试执行时触发探针采集。
    另外如果你使用SonarQube 8.0+版本,旧配置sonar.jacoco.reportPath已经被废弃,不再支持直接读取exec二进制文件,必须读取JaCoCo生成的XML格式报告。

修复方案

  • 升级JaCoCo版本到0.8.8及以上(兼容JDK8-JDK17全版本),直接删除pom中的sonar-jacoco-listeners依赖和surefire/failsafe中的listener配置——高版本JaCoCo不需要依赖额外listener,只要通过argLine挂载agent即可完成采集。
  • 优化surefire/failsafe的argLine配置,增加@{argLine}兜底,避免覆盖其他插件传递的JVM参数:
<argLine>@{argLine} -Xmx4096m ${jacoco.agent.ut.arg}</argLine>
  • 给jacoco-maven-plugin新增XML报告生成逻辑,绑定到test阶段执行:
<execution>
    <id>generate-ut-report</id>
    <phase>test</phase>
    <goals>
        <goal>report</goal>
    </goals>
    <configuration>
        <dataFile>${project.build.directory}/jacoco-ut.exec</dataFile>
        <outputDirectory>${project.build.directory}/site/jacoco-ut</outputDirectory>
    </configuration>
</execution>
  • 将Jenkins中Sonar扫描的覆盖率配置替换为高版本兼容配置:
# SonarQube 8.0+ 读取JaCoCo XML报告的标准配置
sonar.coverage.jacoco.xmlReportPaths=**/target/site/jacoco-ut/jacoco.xml

验证方法

  1. 重新执行构建后,先检查模块target目录下的jacoco-ut.exec文件大小,正常有测试执行的场景下文件不会是几KB的空文件。
  2. 检查target/site/jacoco-ut目录下是否生成jacoco.xml,打开文件能看到对应类的覆盖率计数。
  3. 构建时开启debug日志(加-X参数),查看surefire输出的测试JVM启动参数,确认包含-javaagent:xxx/jacocoagent.jar配置,说明agent挂载成功。
  4. 再执行Sonar扫描即可正常展示覆盖率数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 02:31:14