jacocoTestReport报告为空或覆盖率为0,主因是executionData、classDirectories、sourceDirectories三者路径未严格对齐,且test任务须成功执行并挂载JaCoCo agent。

jacocoTestReport 任务能直接生成报告,但光加插件不配置执行路径和源码映射,大概率会看到空报告或“0% 覆盖率”。
先确认 test 任务是否挂载了 JaCoCo agent
JaCoCo 不是靠扫描源码统计的,它依赖 JVM 启动时注入探针。Gradle 的 jacoco 插件默认会在 test 任务上自动挂载 jacocoAgent,但前提是:test 任务实际执行了测试类(不是跳过、不是失败退出、也不是用了 --no-build-cache 导致缓存了旧 class)。
- 检查日志里有没有类似
argLine = -javaagent:/.../jacocoagent.jar=destfile=...的输出 - 如果用了
useJUnitPlatform()或自定义fork配置,要确保fork = true(否则 agent 不生效) - Java 版本 ≥ 17 时,某些旧版
toolVersion(如 0.8.5)会因字节码格式不兼容导致探针失效,建议统一用0.8.12或更高
jacocoTestReport 报告生成失败的常见原因
报告为空、类名全灰、行覆盖率显示 N/A,基本都指向 executionData 和 classDirectories 映射错位。
-
executionData必须指向真实写入的.exec文件,默认是$buildDir/jacoco/test.exec;但多模块项目中,子模块可能各自生成一份,父模块聚合时得手动指定全部路径 -
classDirectories必须指向编译后的.class文件目录,不是源码路径;Java 项目通常是$buildDir/classes/java/main,Kotlin 则是$buildDir/classes/kotlin/main -
sourceDirectories必须指向原始.java文件路径,不能是src/main/java的 symlink 或 IDE 自动生成的路径(比如 IntelliJ 的out/production)
多模块项目必须做聚合,否则子模块报告互不感知
Gradle 默认不会把子模块的 .exec 数据合并进父模块报告。不显式配置聚合,你看到的只是当前模块的局部覆盖,不是整个项目的实际覆盖。
- 在根
build.gradle中启用org.jacoco.report插件(注意不是jacoco) - 定义一个聚合任务,例如:
tasks.register('aggregateJacocoReport', JacocoReport) { dependsOn subprojects.map { it.tasks.named('test') } executionData.from(subprojects.map { it.tasks.test }) sourceDirectories.from(files(subprojects.sourceSets.main.allSource.srcDirs)) classDirectories.from(files(subprojects.sourceSets.main.output)) } - 别忘了排除 Lombok 生成的类、Spring Boot 的
Generated注解类、以及**/dto/**、**/config/**这类非业务逻辑代码,否则拉低整体数值还干扰判断
报告生成后,index.html 打不开或路径不对
Gradle 生成的 HTML 报告默认放在 build/reports/jacoco/test/html/index.html(单模块)或 build/reports/jacoco/aggregateJacocoReport/html/index.html(聚合任务)。但容易被忽略的是:
立即学习“Java免费学习笔记(深入)”;
- 路径中的
test是任务名,如果你重命名了jacocoTestReport任务,报告目录名也会变 - HTML 报告依赖相对路径加载 JS/CSS,直接双击打开会因 CORS 失败;必须用本地 HTTP 服务(如
python3 -m http.server)或 IDE 内置浏览器预览 - XML 报告(
build/reports/jacoco/test/jacocoTestReport.xml)才是 CI 工具(如 SonarQube、Jenkins JaCoCo Plugin)真正读取的格式,HTML 只供人工查看
.exec 数据、.class 字节码、.java 源码三者严格对齐——差一个路径层级、少一个 files() 包裹、漏掉一个子模块,报告就不可信。


















