根本原因是测试未执行或字节码未被JaCoCo插桩;需在pom.xml中配置prepare-agent(绑定pre-test)和report两个goal,并确保mvn clean test实际运行测试。

JaCoCo Maven 插件怎么配才不会报 coverage report is empty
根本原因通常是测试没跑起来,或者字节码没被 JaCoCo 织入。Maven 默认不执行 test 阶段就生成报告,会导致覆盖率数据为空。
- 必须在
pom.xml的<build><plugins>中声明jacoco-maven-plugin,且至少配置prepare-agent和report两个 goal -
prepare-agent要绑定到pre-test阶段(不是test),否则 JVM 启动时拿不到 agent 参数 - 确保
mvn clean test真正执行了单元测试——检查日志里有没有Ran X tests,而不是只看到编译成功 - 如果用 JUnit 5,需额外加
junit-jupiter-engine依赖,JaCoCo 0.8.7+ 才原生支持;旧版本会静默跳过测试类
为什么 jacoco:report 生成的 HTML 里全是灰色,没覆盖行
灰色 = JaCoCo 没采集到运行时执行痕迹,不是代码没写测试,而是 class 文件没被 instrument(插桩)。
- 确认
target/classes/下的 class 文件是否含 JaCoCo 插入的探针:用javap -c YourClass | grep "Ldc.*jacoco"查看(有则说明插桩成功) - 多模块项目中,
jacoco-maven-plugin必须放在父 pom 的<pluginManagement>里统一管理,子模块各自声明插件但不重复配executions,否则插桩只发生在部分模块 - Spring Boot 项目若用
spring-boot-maven-plugin打 jar,要确保repackage不覆盖掉 JaCoCo 插桩后的 class——把jacoco:prepare-agent放在repackage之前执行
如何让 JaCoCo 报告包含集成测试(IT)覆盖率
默认只统计 src/test/java 下的单元测试,IT 通常在 src/it/java,需要手动指定 class 和测试路径。
- 用
maven-failsafe-plugin运行 IT,并在jacoco-maven-plugin的execution中增加第二个report-aggregategoal - 设置
<dataFile>${project.build.directory}/coverage-reports/jacoco-it.exec</dataFile>,并在 failsafe 插件里通过argLine指向该路径 - 聚合报告要用
report-aggregate,不能用普通report,否则只扫当前模块的 classes - 注意:IT 类路径和主 class 路径可能不同,
<sourceDirectories>和<classDirectories>得显式指向target/classes和target/test-classes,别依赖默认值
Gradle 用户遇到 Could not find method jacoco() for arguments
这是 Gradle 插件 DSL 变更导致的兼容问题,尤其在 Gradle 7.0+ 和 JaCoCo 0.8.8+ 组合下常见。
立即学习“Java免费学习笔记(深入)”;
- 不要用老式写法:
apply plugin: 'jacoco'+jacoco { ... },改用plugins { id 'org.gradle.jacoco' version '0.8.11' } - 配置块必须写成
jacoco { toolVersion = "0.8.11" },且放在plugins块之后、tasks之前 - 若用
test.finalizedBy jacocoTestReport,确保testtask 确实执行了——有些 CI 环境会跳过 test 直接打包,导致 exec 文件不存在而报错 - Gradle Kotlin DSL 用户注意:
jacocoTestReport是 lazy task,引用时得用tasks.named("jacocoTestReport"),直接写jacocoTestReport { ... }会触发初始化异常
最常被忽略的是:JaCoCo 报告只反映「被执行过的字节码」,它不管逻辑对不对、分支走没走全。一个 if (true) 永远不进 else 分支,覆盖率可能是 100%,但实际漏测了关键路径。别只盯数字,得看报告里具体哪几行没亮。










