使用Gradle Kotlin DSL配置Jacoco:排除分析类无可行示例的问题
我之前也碰到过一模一样的问题!折腾了好一阵才搞明白怎么正确配置Jacoco排除特定类,尤其是用afterEvaluate的时候容易踩坑。下面给你几个亲测有效的配置示例,分Gradle Groovy和Kotlin DSL两种情况,还有常见的坑点要注意:
核心配置思路
Jacoco的排除规则是针对编译后的.class文件生效的,所以关键是要正确指定classDirectories的排除路径,而不是源码文件路径。如果用afterEvaluate,是为了确保在所有任务都初始化完成后再修改Jacoco的配置,避免因为插件动态生成任务导致配置不生效。
1. Gradle Groovy DSL 配置示例
plugins { id 'java' id 'jacoco' } jacoco { toolVersion = "0.8.10" // 建议用最新稳定版本 } // 配置测试报告的排除规则 jacocoTestReport { afterEvaluate { classDirectories.setFrom(files(classDirectories.files.collect { fileTree(dir: it, exclude: [ 'com/example/dto/**', // 排除dto包下所有类 'com/example/config/**', // 排除配置类包 'com/example/*Application.class' // 排除Spring Boot启动类 ]) })) } } // 如果需要做覆盖率验证,同样配置排除规则 jacocoTestCoverageVerification { afterEvaluate { classDirectories.setFrom(files(classDirectories.files.collect { fileTree(dir: it, exclude: [ 'com/example/dto/**', 'com/example/config/**', 'com/example/*Application.class' ]) })) // 这里可以加覆盖率阈值配置 violationRules { rule { limit { minimum = 0.8 // 最低覆盖率80% } } } } }
2. Gradle Kotlin DSL 配置示例
plugins { java jacoco } jacoco { toolVersion = "0.8.10" } tasks.jacocoTestReport { afterEvaluate { classDirectories.setFrom(files(classDirectories.files.map { fileTree(it) { exclude( "com/example/dto/**", "com/example/config/**", "com/example/*Application.class" ) } })) } } tasks.jacocoTestCoverageVerification { afterEvaluate { classDirectories.setFrom(files(classDirectories.files.map { fileTree(it) { exclude( "com/example/dto/**", "com/example/config/**", "com/example/*Application.class" ) } })) violationRules { rule { limit { minimum = 0.8 } } } } }
常见坑点(你之前失败可能是这些原因)
- 路径格式错误:必须用编译后的class文件路径,比如
com/example/dto/**,而不是src/main/java/com/example/dto/**,也不要加.java后缀,要针对.class文件。 - 时机不对:如果你的项目有其他插件(比如Spring Boot插件)会动态修改任务,必须把排除配置放在
afterEvaluate块里,确保Jacoco任务初始化完成后再修改。 - 包名写错:检查排除的包名是否和实际类的全限定名一致,比如有没有大小写错误,或者少了层级。
验证是否生效
运行./gradlew jacocoTestReport(Windows用gradlew.bat jacocoTestReport),然后打开build/reports/jacoco/test/html/index.html,在左侧导航栏看看排除的类是不是已经不在报告里了。
内容的提问来源于stack exchange,提问作者yodamad
相关产品推荐
相关产品推荐

