Gradle从3.5迁移至4.6后Jacoco插件无法生成exec文件
我之前升级Gradle版本时也碰到过类似的Jacoco任务异常,结合你提供的日志和脚本信息,咱们来拆解解决:
问题根源
Gradle 4.x对Jacoco插件的任务触发逻辑做了优化,jacocoTestReport任务默认的onlyIf条件会检查测试任务是否生成了有效的Jacoco exec数据文件。如果exec文件不存在、或者测试任务根本没执行,这个报告任务就会被标记为跳过,也就是你日志里看到的Skipping task ':common:jacocoTestReport' as task onlyIf is false。
分步解决方案
1. 先确认测试任务是否真的执行并生成了exec文件
首先执行带详细日志的测试命令,确认测试任务的状态:
./gradlew clean test --info
重点看这几个点:
- 有没有看到
Task :common:test的执行日志,是否真的运行了测试类? - 日志里有没有类似
Jacoco agent started的输出,以及exec文件的生成路径(默认是build/jacoco/test.exec)?
如果测试任务被标记为UP-TO-DATE或者SKIPPED,那自然不会生成exec文件,报告任务也会跟着跳过。
2. 修正Jacoco报告任务的配置
Gradle 4.6对jacocoTestReport的默认配置有调整,你需要显式指定exec文件路径,并确保任务依赖测试任务:
修改你的subprojects里的Jacoco配置:
subprojects { apply plugin: 'java' apply plugin: 'jacoco' apply plugin: 'idea' // ...其他配置 jacocoTestReport { // 确保报告任务在测试任务完成后执行 dependsOn test // 显式指定exec文件的查找路径,避免版本差异导致的路径问题 executionData fileTree(dir: project.buildDir, includes: ['jacoco/test.exec']) reports { xml.enabled true html.enabled true // 建议开启html报告,方便查看 } } }
3. 临时强制执行报告任务(排查用)
如果想快速验证是不是onlyIf条件的问题,可以临时强制关闭这个判断:
jacocoTestReport { onlyIf { true } // 强制执行任务,忽略默认条件 // 其他配置... }
执行./gradlew jacocoTestReport后,如果build/jacoco文件夹生成了,说明问题确实是找不到exec文件,回到步骤1和2排查测试任务和路径配置。
4. 检查子项目的自定义配置冲突
如果是多模块项目,要确认子项目有没有重写测试任务的Jacoco配置,比如修改了jacoco.destinationFile:
test { jacoco { destinationFile = file("$buildDir/custom-path/test.exec") } }
这种情况下,jacocoTestReport的executionData也要对应修改成自定义路径,否则会找不到exec文件。
总结
核心就是Gradle 4.6强化了Jacoco任务的依赖校验,只要确保测试任务正常执行、exec文件路径配置正确,报告任务就能正常生成文件和文件夹了。
内容的提问来源于stack exchange,提问作者Hunar Letsko

