运行 ./gradlew tasks 可查看当前项目已注册的任务,加 --all 或 --group 参数可筛选;任务缺失常因未启用对应插件、不在当前模块、settings.gradle 配置错误或子项目名冲突所致。

运行 gradlew tasks 看清当前项目有哪些任务
Gradle 不会自动告诉你“哪个任务名不明确”,它只会报错说 Task 'xxx' not found,但真实原因可能是:你输对了名字,但那个任务根本不在当前 project 下;或者名字拼写接近但不一致(比如 run 和 Run);又或者任务被定义在子模块里,而你却在根目录下执行。
最直接的办法是先跑一遍:./gradlew tasks(Linux/macOS)或 gradlew.bat tasks(Windows)
这个命令列出的是「当前 project」中所有已注册的任务——注意不是整个多模块项目的全部任务。如果你在根目录运行,它只显示根项目的任务;如果某个 run 任务定义在 :app 模块里,那你在根目录跑 tasks 就看不到它。
- 加
--all参数可查看所有 task(包括未分组、未描述的),但输出很长,适合 grep 过滤:./gradlew tasks --all | grep run - 加
--group="application"可聚焦某类任务,比如 application 插件提供的run - 如果输出为空或只有
help、projects等基础任务,说明 build.gradle 没加载成功,或 Gradle wrapper 根本没识别到项目结构
确认你在正确的 project 目录下执行命令
多模块项目里,run、build、assemble 这类任务通常不会定义在根 build.gradle 中,而是由子模块的插件提供。例如 Android 项目里,assembleDebug 只存在于 :app 模块;Kotlin 后端项目用 application 插件时,run 也只在启用该插件的子模块中生效。
常见错误场景:
- 你在项目根目录执行
./gradlew run,但run实际定义在backend/子目录下 → 应该先cd backend再执行 - 你用了
gradle :backend:run,但settings.gradle里漏写了include 'backend'→ Gradle 根本不认这个路径,报错仍是 “not found” - 你用 VSCode 点击 “Run Task”,但插件默认在 workspace root 执行,没切到子模块目录 → 任务面板里压根不出现
run
检查 build.gradle 是否启用了对应插件
很多“看起来该有”的任务其实是插件动态注入的,不是 Gradle 自带的。比如:
-
run来自application插件,必须显式声明:plugins { id 'application' } -
bootRun来自 Spring Boot 插件:id 'org.springframework.boot' version '3.3.0' apply false+ 子模块中apply plugin: 'org.springframework.boot' -
assemble是 Java 插件的一部分,但 Android 项目里它被替换为assembleDebug等变体,原生assemble反而不注册
如果你的 build.gradle 里没启用这些插件,Gradle 就不会生成对应任务,哪怕名字拼得再准也没用。另外注意插件版本兼容性:Gradle 8.9 不支持旧版 spring-boot-gradle-plugin 2.x,插件加载失败会导致任务缺失,且错误可能静默吞掉——你只看到“not found”,却看不到插件加载失败的日志。
别忽略 settings.gradle 和子项目名称冲突
当 ./gradlew :moduleA:run 报错 “not found”,除了上面几点,还有一个隐蔽但高频的原因:子项目名称重复。比如你有两个模块都叫 model,一个在 core/model,一个在 api/model,但 settings.gradle 里只写了 include 'model'(没带路径前缀),Gradle 会把它们当成同一个 project,后加载的那个覆盖前一个,导致部分任务注册失败。
验证方式很简单:
- 打开
settings.gradle,确认每个include的路径和磁盘实际目录严格一致,比如include ':core:model', ':api:model' - 运行
./gradlew projects,看输出的 project tree 是否和你预期的一致;如果某个子模块根本没列出来,就是settings.gradle漏了或路径写错了 - 子项目名尽量避免纯通用词(
common、utils、model),改用带上下文的命名(core-model、api-client),能从根源上避开解析歧义
这种问题最难排查,因为 Gradle 不报错,只是 quietly 跳过注册——你写的 task 定义语法完全正确,但它压根没进执行图。


















