JavaExec任务中需用jvmArgs设置JVM参数(如'-Xmx2g')、systemProperty设置系统属性(如'Dspring.profiles.active=dev'),且run、bootRun、test等任务须分别配置,gradle.properties中的org.gradle.jvmargs仅影响Gradle进程本身。

JavaExec 任务里用 jvmArgs 设置运行时参数
Gradle 启动 Java 应用(比如 ./gradlew run)走的是 JavaExec 类型任务,不是 Gradle 自身进程。所以必须在 tasks.withType(JavaExec) 块里配,而不是改 gradle.properties。
常见错误是把构建参数和运行参数混为一谈:你在 gradle.properties 里写的 org.gradle.jvmargs 只影响 Gradle 守护进程本身,对 run 或 test 启动的子 JVM 没有作用。
-
jvmArgs接收字符串数组,支持标准 JVM 参数,例如:'-Xmx2g'、'-XX:+UseZGC'、'-Dspring.profiles.active=dev' - 系统属性用
systemProperty 'key', 'value'单独设,不要塞进jvmArgs—— 否则会报错Unrecognized option: -D... - 如果项目有多个
JavaExec任务(比如自定义的startServer),每个都要显式配置,或用allprojects统一覆盖
区分 run 和 bootRun 的配置位置
Spring Boot 项目默认用 bootRun(来自 Spring Boot 插件),它也是 JavaExec 的子类,但配置方式略有不同:
- 普通
run:直接写tasks.withType(JavaExec) -
bootRun:要写tasks.named('bootRun')或tasks.withType(org.springframework.boot.gradle.tasks.run.BootRun),否则不生效 - Spring Boot 2.4+ 默认禁用
systemProperties透传,需手动开启:systemProperties = System.properties才能让-D参数进应用
命令行临时覆盖比写死在 build.gradle 更灵活
开发调试时,硬编码在 build.gradle 里反而容易冲突。推荐用 -D 或 --args 动态传参:
立即学习“Java免费学习笔记(深入)”;
-
./gradlew run --args='-Xmx1g -Dlog.level=debug'→ 这些会作为应用参数(String[] args),不是 JVM 参数 - 真正想改 JVM 参数,得用系统属性方式:
./gradlew run -Dorg.gradle.jvmargs="-Xmx1g -XX:+PrintGCDetails"—— 注意这是 Gradle 进程参数,只对当前这次执行生效 - 更稳妥的做法是结合
gradle.properties+JavaExec:在gradle.properties里定义app.jvmargs=-Xmx2g,然后在build.gradle中读取:jvmArgs = project.findProperty('app.jvmargs')?.split() ?: []
别漏掉 test 和 integrationTest 的独立配置
测试任务也继承 JavaExec,但很多人只配了 run,结果跑测试时堆溢出或 GC 超时。
-
test任务默认不继承JavaExec的通用配置,必须单独声明:tasks.test { jvmArgs '-Xmx1g' } - 集成测试常需更大内存和超时容忍,建议分开配:
tasks.named('integrationTest') { jvmArgs '-Xmx3g', '-XX:MaxMetaspaceSize=512m' } - Kotlin 编译测试时还会额外吃 Metaspace,
-XX:MaxMetaspaceSize不设够容易触发OutOfMemoryError: Metaspace
最易被忽略的一点:JavaExec 配置不会自动继承 compileJava 或 compileTestJava 的 forkOptions,它们是编译阶段的子进程参数,和运行时完全隔离。想调大编译内存,得去配 JavaCompile.forkOptions;想调大运行内存,必须落在 JavaExec 上 —— 两者不能互相替代。


















