Gradle7.1.1配置JacocoTestReport排除文件时报setFrom方法不存在如何解决
Jacoco + Gradle7.x 配置排除规则构建报错解决方案
报错信息:Could not find method setFrom() for arguments [file collection] on main classes of type org.gradle.api.internal.tasks.DefaultSourceSetOutput
问题根因
- 版本不兼容:Jacoco 0.8.4 发布时间早于Gradle 7.1.1,Gradle 7.x对任务属性API做了破坏性调整,旧版本Jacoco插件的
classDirectories属性未适配新的setFrom()方法签名 - 配置写法不规范:原配置中在
afterEvaluate块内直接对classDirectories调用setFrom()的方式不符合Gradle 7.x的API调用规范
解决方案
方案1:升级Jacoco到兼容版本(推荐)
Gradle 7.1.1 要求Jacoco版本不低于0.8.7,先全局指定Jacoco工具版本,再调整报告配置:
// 全局指定Jacoco版本,放在jacocoTestReport配置之前 jacoco { toolVersion = "0.8.8" } jacocoTestReport { group = "Reporting" dependsOn test // 确保单测执行完成后再生成报告 reports { xml.enabled false csv.enabled false html.enabled true html.destination = file("${buildDir}/reports/jacoco") } // 直接配置过滤规则,不需要嵌套afterEvaluate块 classDirectories.setFrom( fileTree(dir: sourceSets.main.output.classesDirs) { exclude( // 此处填写实际需要排除的路径规则,例如: "**/config/**", "**/constant/**", "**/*DTO.class" ) } ) // 显式指定源码路径和单测执行数据文件,避免路径读取异常 sourceDirectories.setFrom(sourceSets.main.allJava.srcDirs) executionData.setFrom(file("${buildDir}/jacoco/test.exec")) }
方案2:保留Jacoco 0.8.4版本,调整配置写法
如果因业务限制不能升级Jacoco版本,修改afterEvaluate块内的赋值逻辑:
jacocoTestReport { group = "Reporting" reports { xml.enabled false csv.enabled false html.enabled true html.destination = "${buildDir}/reports/jacoco" } afterEvaluate { def filteredClassFiles = classDirectories.files.collect { dir -> fileTree(dir: dir, exclude: [ // 此处填写实际需要排除的路径规则 ]) } // 直接赋值整个文件集合,不调用setFrom方法 classDirectories = files(filteredClassFiles) } }
验证方式
执行以下命令验证配置是否生效:
- 清理历史构建产物:
./gradlew clean - 生成Jacoco覆盖率报告:
./gradlew jacocoTestReport
构建成功后打开${buildDir}/reports/jacoco/index.html即可查看过滤后的覆盖率数据。
内容的提问来源于stack exchange,提问作者user1905
相关产品推荐
相关产品推荐

