dependson 是 gradle 中强制性的前置依赖机制,确保任务按显式声明的顺序执行:a dependson b 即 b 完成后 a 才启动,影响执行状态传递且构建 dag;它不自动推断,需手动声明,与 mustrunafter 的弱顺序约束有本质区别。

在 Gradle 中,dependsOn 是最直接、最常用的方式,用来声明一个任务必须在另一个(或多个)任务**执行完成之后**才能运行。它不是“建议顺序”,而是强制性的前置依赖——Gradle 会据此构建有向无环图(DAG),并严格按拓扑序执行。
dependsOn 的基本写法和效果
只要 A dependsOn B,Gradle 就保证:B 执行完毕(无论成功或失败,除非被跳过)后,A 才开始执行。注意:这不表示 B 的输出一定是 A 的输入,仅是执行时序约束。
- 单任务依赖:
taskA.dependsOn taskB或taskA { dependsOn taskB } - 多任务依赖:
taskC.dependsOn taskA, taskB或taskC { dependsOn ['taskA', 'taskB'] } - 动态匹配依赖:
task integrationTest { dependsOn tasks.matching { it.name.startsWith('test') } }
依赖必须显式声明,不会自动推断
Gradle 不会因为任务名相似或逻辑相关就自动建立 dependsOn 关系。比如你写了 task deploy 和 task build,Gradle 完全不知道 deploy 应该等 build 结束——除非你明确写 deploy.dependsOn build。默认只存在插件预设的隐式依赖(如 classes → compileJava),自定义任务之间全是“孤立”的。
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
- 插件自带的隐式链(如
build→classes→compileJava)不能替代你自己的业务依赖 - 如果漏写 dependsOn,两个任务可能并发执行,或按字母顺序随意调度,结果不可控
与 mustRunAfter 的关键区别
dependsOn 建立的是强依赖关系:它影响任务是否执行(若 B 被跳过,A 也会被跳过);而 mustRunAfter 只是顺序约束,不传递执行状态。例如:
-
clean.mustRunAfter build:build 先跑,clean 后跑;但如果 clean 被单独调用,build 不会自动触发 -
deploy.dependsOn build:调用 deploy 时,build 必定被执行;若 build 失败,deploy 直接中止
常见陷阱与避坑建议
实际配置中容易出错的地方集中在作用域和时机上:
- 不要在任务闭包外直接调用未定义的任务名,如
taskA.dependsOn unknownTask会抛UnknownTaskException - 避免循环依赖:A dependsOn B,B dependsOn A —— Gradle 会在配置阶段报错
- 跨项目依赖需加项目前缀:
deploy.dependsOn ':app:build'(多模块场景) - 若依赖的是由插件动态创建的任务(如
testDebugUnitTest),建议用tasks.named('testDebugUnitTest')延迟解析,防止配置阶段找不到
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










