如何在Gradle Kotlin DSL中延迟向子项目应用插件?
为Java子项目延迟应用Checker Framework插件的正确方式
问题背景
需要给包含多个Java子项目的项目延迟应用Checker Framework插件(该方案可推广至任意Gradle插件):
- 原配置直接在子项目配置阶段检查Java源码目录并应用插件,执行
.\gradlew.bat build --scan后发现未实现任务延迟创建 - 修改为在
JavaCompile任务的configureEach中应用插件后,出现如下报错:
Could not determine the dependencies of task ':mysubproject1:jar'. > Could not create task ':mysubproject1:compileJava'. > Failed to apply plugin 'org.checkerframework'. > DefaultTaskCollection#configureEach(Action) on task set cannot be executed in the current context.
原配置代码:
plugins { alias(buildscript.plugins.sonarqube) id("org.checkerframework") version "0.6.36" } subprojects { if (file("src/main/java").isDirectory) { apply(plugin = "org.checkerframework") checkerFramework { checkers = listOf("org.checkerframework.checker.nullness.NullnessChecker") } } // 其他配置... }
错误修改后的配置:
plugins { id("org.checkerframework") version "0.6.36" } subprojects { tasks.withType<JavaCompile>().configureEach { apply(plugin = "org.checkerframework") checkerFramework { checkers = listOf("org.checkerframework.checker.nullness.NullnessChecker") } } // 其他配置... }
错误原因
在tasks.withType<JavaCompile>().configureEach块中应用插件是错误的:任务集合的初始化上下文不允许执行插件应用操作,插件应用会修改项目的任务结构,此时任务集合处于不可修改的状态,因此抛出异常。
正确实现方案
核心思路:在根项目声明插件但不立即应用,仅在子项目满足条件(存在Java源码/已应用Java插件)且时机成熟时,延迟应用插件。
方案代码
plugins { alias(buildscript.plugins.sonarqube) // 根项目声明插件但不应用,子项目可直接复用版本 id("org.checkerframework") version "0.6.36" apply false } subprojects { // 仅在存在Java源码目录的子项目中处理 val hasJavaSource = file("src/main/java").isDirectory if (hasJavaSource) { // 延迟到Java插件应用完成后,再应用Checker Framework并配置 pluginManager.withPlugin("java") { apply(plugin = "org.checkerframework") checkerFramework { checkers = listOf("org.checkerframework.checker.nullness.NullnessChecker") } } } // 其他配置... }
方案解释
- 根项目声明插件:使用
apply false让根项目仅下载插件并管理版本,避免子项目重复声明版本号 - 条件筛选子项目:通过检查
src/main/java目录是否存在,确保只在Java子项目中处理 - 延迟应用时机:
pluginManager.withPlugin("java")会在子项目成功应用Java插件后触发回调,此时Java相关任务(如compileJava)的创建逻辑已初始化,应用Checker Framework插件不会干扰任务创建流程,真正实现任务的延迟创建
内容的提问来源于stack exchange,提问作者cp5
相关产品推荐
相关产品推荐

