JavaExec任务的main方法参数必须通过args属性传入,每项对应args数组一个元素;含空格参数需独立传入;命令行用-P传参,IDE配置不生效;注意任务覆盖和执行确认。

JavaExec 任务里用 args 传参,不是 systemProperties
运行时参数(即 main(String[] args) 接收的字符串数组)必须通过 JavaExec 任务的 args 属性传入,而不是 systemProperties 或 jvmArgs。后者只影响 JVM 启动参数或系统属性,对 main 方法入参完全无效。
-
args接收的是List<string></string>,每项对应main中的一个元素,比如["--port", "8080"]→args[0] == "--port",args[1] == "8080" - 若从命令行传参,推荐用
-P定义 project property,再在args中解析:args(project.findProperty("appArgs")?.toString().split(",") ?: []) - 别把多个值拼成一个字符串塞进去,
args(["--port,8080"]) → main只收到一个元素,不是两个
带空格或特殊字符的参数要单独拆开
JavaExec 不做 shell 解析,它直接把 args 数组逐项传递给 main。所以含空格的参数(如路径、JSON 片段)必须作为独立字符串传入,不能依赖引号包裹。
- ✅ 正确:
args(["--config", "/path/to/app config.json", "--debug"])→args[1]是完整路径字符串 - ❌ 错误:
args(["--config '/path/to/app config.json'"]) → main收到带单引号的整个字符串,程序会解析失败 - 如果参数来自用户输入或环境变量,先用 Groovy 的
split()拆分,再过滤空字符串:project.property("rawArgs").toString().split("\s+").findAll { it.trim() }
Gradle 命令行传参和 IDE 运行配置不互通
用 ./gradlew run -PappArgs=... 能生效,但 IntelliJ 的「Run Configuration」里填的 Program arguments 对 Gradle 任务无效——它只影响 IDEA 自己启动的 JVM,绕过了 JavaExec 配置。
- IDE 中想调试带参运行,必须在
run任务里硬编码测试参数,或改用gradle run -P...命令触发 - Android Studio 或老版本 IDEA 可能缓存旧的
run配置,删掉.idea/runConfigurations/下对应 XML 文件可强制刷新 - 多
sourceSet(如integrationTest)需单独注册JavaExec任务,共用一个run名称会导致覆盖
参数没进 main?先确认任务是否真被触发
常见现象是改了 args 却发现 main 里 args.length == 0,大概率因为执行的不是你定义的 JavaExec 任务,而是默认的 run(来自 application 插件)或 IDE 自带的启动逻辑。
立即学习“Java免费学习笔记(深入)”;
- 运行前加
--info看实际执行的任务:./gradlew run --info | grep "Executing task ':run'" - 检查是否意外启用了
application插件——它自带run任务,会覆盖你自定义的同名任务 - 用
tasks.register而非task定义新任务,避免被其他插件提前创建同名任务劫持 - 在
doFirst里加日志:doFirst { println "Running with args: ${args}" },确认参数在执行阶段确实存在


















