You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

多层级配置Gradle项目JaCoCo覆盖率报告排除类的方法

解决Gradle约定插件与模块级JaCoCo排除规则叠加问题

问题根源在于你当前的写法是通过setFrom直接替换classDirectories集合,后配置的规则会覆盖前序配置(你遇到的约定插件规则生效、模块级不生效的情况,是因为配置阶段classDirectories.files尚未初始化,模块级的替换操作实际上没有生效,而约定插件的配置会在任务执行阶段延迟解析)。

以下两种方案可以实现多位置排除规则的叠加生效:

方案一:直接修改现有FileTree的排除规则

不替换整个classDirectories集合,而是对已有的ConfigurableFileTree添加排除规则,这样约定插件和模块级的规则会叠加生效。

约定插件代码(buildSrc/src/main/kotlin/mapstruct-conventions.gradle.kts)

// ...其他配置
tasks.jacocoTestReport {
    classDirectories.configure {
        files.forEach { fileTree ->
            (fileTree as ConfigurableFileTree).exclude("**/*MapperImpl*")
        }
    }
}

模块级代码(database-jooq/build.gradle.kts)

plugins {
    id("mapstruct-conventions")
}

tasks.jacocoTestReport {
    classDirectories.configure {
        files.forEach { fileTree ->
            (fileTree as ConfigurableFileTree).exclude("**/jooq/generated/**")
        }
    }
}

方案二:使用Gradle延迟配置API叠加规则

利用Gradle的Provider延迟解析特性,基于前序配置的结果叠加新的排除规则,确保两个位置的规则都能生效。

约定插件代码

// ...其他配置
tasks.jacocoTestReport {
    classDirectories = classDirectories.map { dirs ->
        dirs.files.flatMap { dir ->
            fileTree(dir).exclude("**/*MapperImpl*")
        }
    }
}

模块级代码

plugins {
    id("mapstruct-conventions")
}

tasks.jacocoTestReport {
    classDirectories = classDirectories.flatMap { dirs ->
        dirs.files.flatMap { dir ->
            fileTree(dir).exclude("**/jooq/generated/**")
        }
    }
}

关于afterEvaluate异常的说明

你遇到的IllegalMutationException是因为Gradle不允许在某些上下文(如插件配置块内部)调用afterEvaluate,上述方案无需依赖afterEvaluate即可解决问题,自然规避了该异常。

内容的提问来源于stack exchange,提问作者Martin Tarjányi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 09:40:48