Gradle命令行不支持任务名含空格,因shell将空格视为参数分隔符,导致gradle "my task"被拆解为两个独立任务my和task,从而报错“Task 'my' not found”或“Task 'task' not found”。

Gradle 命令中任务名含空格时会直接报错
Gradle 命令行本身不支持任务名中包含空格——这不是语法限制,而是 shell 解析机制决定的:gradle 进程收到的参数列表里,空格天然就是分隔符。如果你写 gradle my task,Gradle 实际收到两个独立任务名:my 和 task,而不是一个叫 my task 的任务。
常见错误现象:
- 执行
gradle "my task"或gradle 'my task'后提示Task 'my' not found或Task 'task' not found - 自定义任务名用了空格(如
task "build dist" ),但命令行始终无法命中
根本原因:Gradle 任务注册时允许字符串名含空格,但命令行解析阶段已按空格切分,任务名在抵达 Gradle 内部前就“碎了”。
解决办法只有两个,且必须二选一:
- 改用无空格的任务名,比如把
"build dist"改成buildDist或buildDistTask - 如果必须保留语义上的空格(如 CI 脚本兼容旧命名),改用
-b指定构建文件 +-P传参方式间接触发,而非直接靠任务名
Gradle 选项值带空格必须用等号连接
和任务名不同,选项(option)的值如果含空格,不能靠引号包裹后空格分隔,否则 Gradle 会把引号当值的一部分,或 shell 提前截断。
错误写法(全部失效):
gradle build --console "plain rich"
gradle build --console='plain rich'
gradle build --console "plain" "rich"
正确写法只有一种:
- 必须使用
=连接选项与值,且值两端可加引号(推荐):--console="plain rich" - 等号前后不能有空格:
--console = "plain rich"会报错 - 不加引号也能工作,但遇到路径、含空格的 profile 名等场景极易出错,所以一律建议加双引号
其他类似选项也适用该规则:
--project-prop="key=va lue with space"--system-prop="user.name=John Doe"-PmyProp="hello world"
Windows 下 gradlew.bat 对空格更敏感
Windows 的 cmd.exe 和 PowerShell 在处理引号和空格时逻辑不同,gradlew.bat 脚本又额外做了一层参数转发,容易多吞掉一层引号。
典型表现:
- 在 PowerShell 中写
./gradlew build --console="plain rich"可能被解析成--console=plain rich(引号丢失) - 在 cmd 中写
gradlew build --console="plain rich"更稳定,但仍建议避免值中出现多个连续空格
稳妥做法:
- 统一用
./gradlew(macOS/Linux)或.\gradlew.bat(PowerShell)启动,避免混用gradle命令 - 所有带空格的选项值,强制用
=+ 双引号,例如:--info --console="plain"而不是--info --console plain - 若需调试参数传递过程,可在
gradle.properties中设org.gradle.configuration-cache=false并加--debug查看 Gradle 实际收到的参数列表
真正需要空格的场景:用 -b + -P 替代任务名
如果你控制不了任务名(比如继承了遗留脚本,其中定义了 task "deploy to prod"),又必须从命令行调用它,唯一可靠路径是绕过任务名匹配机制。
操作步骤:
- 新建一个临时构建文件
run.groovy,内容为:def targetTaskName = project.findProperty("TASK_NAME") ?: "help" project.tasks.findByName(targetTaskName)?.execute() - 执行:
gradle -b run.groovy -PTASK_NAME="deploy to prod"
注意点:
- 这种方式不走 Gradle 的依赖图分析,
dependsOn不生效,需手动确保前置任务已执行 -
execute()是内部 API,Gradle 8+ 已标记为 deprecated,仅作紧急规避,不可长期依赖 - 更可持续的做法仍是重构任务名为驼峰式,比如
deployToProd
空格问题本质不是 Gradle 的 bug,而是它选择信任 shell 参数传递契约的结果。越早放弃“任务名带空格”这个念头,后续 CI/CD 配置、IDE 集成、跨平台协作就越少踩坑。


















