无法移除Gradle中generateJooq对compileKotlin的任务依赖问题
解决Gradle中nu.studer.jooq插件自动添加的任务依赖问题
问题场景
使用Gradle的nu.studer.jooq插件时,generateJooq任务被自动设置为compileJava和compileKotlin的依赖,任务依赖树如下:
:db:compileJava +--- :db:compileKotlin | \--- :db:generateJooq \--- :db:generateJooq *
需要移除该自动依赖,仅在需要时手动执行generateJooq,当前Gradle版本为8.2.1。
无效的尝试
曾使用以下代码尝试移除依赖,但无效果:
project.afterEvaluate { val generateJooq = tasks.findByPath("generateJooq") this.tasks.withType<KotlinCompile> { setDependsOn(dependsOn - setOf(generateJooq)) } }
调试发现dependsOn集合为空,但执行compileKotlin时仍会触发generateJooq。
解决方案
方法1:通过插件配置禁用自动依赖
nu.studer.jooq插件提供了generateSchemaSourceOnCompilation配置项,设置为false即可禁止编译任务自动依赖generateJooq:
jooq { version.set("你的JOOQ版本号") // 替换为实际使用的版本 configurations { create("main") { generateSchemaSourceOnCompilation.set(false) } } }
方法2:手动移除Source Set关联(若方法1无效)
插件可能将generateJooq的输出目录加入了主Source Set的源目录中,Gradle会自动将生成这些源的任务设为编译依赖。需要手动移除该关联:
project.afterEvaluate { val generateJooqTask = tasks.named<nu.studer.gradle.jooq.JooqGenerate>("generateJooq").get() // 从主Source Set中移除generateJooq的输出目录 sourceSets.main { java.srcDirs.remove(generateJooqTask.outputDirectory) kotlin.srcDirs.remove(generateJooqTask.outputDirectory) } // 确保编译任务不依赖generateJooq tasks.withType<KotlinCompile> { dependsOn.remove(generateJooqTask) } tasks.withType<JavaCompile> { dependsOn.remove(generateJooqTask) } }
原理说明
之前的方法无效,是因为插件并非直接给编译任务添加dependsOn,而是通过将generateJooq的输出目录注册到主Source Set的源目录中。Gradle的增量编译机制会自动识别这些生成的源文件,并将生成它们的任务(即generateJooq)设为编译任务的隐式依赖,因此仅修改dependsOn集合无法移除该关联。
内容的提问来源于stack exchange,提问作者Sebastian Lore
相关产品推荐
相关产品推荐

