JDK11+AGP7.0.+Gradle7.0+环境下JacocoTaskExtension不存在问题求助
问题根因
- Gradle 7.0 版本正式移除了自Gradle 6.6就标记废弃的
org.gradle.testing.jacoco.plugins.JacocoTaskExtension类,同时原先用于获取Java项目配置的JavaPluginConvention也已废弃,替换为新的JavaPluginExtension - 该报错和JDK版本无关,属于Gradle版本迭代的API变更,AGP 7.x强制要求配套JDK11只是触发该问题的前置条件
修复方案
1. 调整导入语句
删除原代码中两个废弃API的导入:
import org.gradle.api.plugins.JavaPluginConvention import org.gradle.testing.jacoco.plugins.JacocoTaskExtension
替换为对应新API的导入:
import org.gradle.api.plugins.JavaPluginExtension // 若后续需要配置Jacoco任务参数,可补充导入以下类 import org.gradle.testing.jacoco.tasks.JacocoReport import org.gradle.testing.jacoco.tasks.JacocoCoverageVerification
2. 替换sourceSets获取逻辑
原代码中使用废弃JavaPluginConvention获取sourceSets的逻辑需要调整为新API:
// 旧写法 private val Project.sourceSets get() = convention.getPlugin(JavaPluginConvention::class).sourceSets // 新写法 private val Project.sourceSets get() = extensions.getByType(JavaPluginExtension::class).sourceSets
3. Jacoco测试任务配置适配
如果后续业务逻辑中存在对Test任务配置Jacoco参数的代码,需要同步调整写法:
// 旧写法,依赖JacocoTaskExtension tasks.withType<Test> { extensions.configure(JacocoTaskExtension::class) { isIncludeNoLocationClasses = true excludes = listOf("jdk.internal.*") } } // Gradle7+ 新写法,直接访问Test任务内置的jacoco扩展 tasks.withType<Test> { jacoco { isIncludeNoLocationClasses = true excludes.set(listOf("jdk.internal.*")) } }
4. 其他兼容注意项
- 你当前配置的Jacoco 0.8.7版本本身已经兼容Gradle7.x和AGP7.x,无需修改版本号;如果后续升级更高版本AGP,可同步升级Jacoco到0.8.8+避免类兼容问题
- 自定义JacocoReport任务的
executionData、sourceDirectories等配置项API无变更,不需要调整
内容的提问来源于stack exchange,提问作者jitendra kumar
相关产品推荐
相关产品推荐

