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年的老旧版本,存在两个核心兼容问题:
- 生成的exec二进制文件格式过旧,SonarQube 7.9+内置的SonarJava插件无法正常解析,会直接判定无覆盖率数据。
- 老旧的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
验证方法
- 重新执行构建后,先检查模块target目录下的
jacoco-ut.exec文件大小,正常有测试执行的场景下文件不会是几KB的空文件。 - 检查
target/site/jacoco-ut目录下是否生成jacoco.xml,打开文件能看到对应类的覆盖率计数。 - 构建时开启debug日志(加
-X参数),查看surefire输出的测试JVM启动参数,确认包含-javaagent:xxx/jacocoagent.jar配置,说明agent挂载成功。 - 再执行Sonar扫描即可正常展示覆盖率数据。
内容的提问来源于stack exchange,提问作者Alexei
相关产品推荐
相关产品推荐

