Spring Boot Gradle插件为何忽略启动脚本中的applicationDefaultJvmArgs?
解决Spring Boot Gradle插件启动脚本忽略applicationDefaultJvmArgs的问题
我之前也踩过这个坑!原生Gradle Application插件的applicationDefaultJvmArgs确实能把参数写入启动脚本,但Spring Boot Gradle插件生成的boot分发包走的是一套独立的启动脚本生成逻辑,所以不会自动读取这个配置。
正确的配置方式
你需要用Spring Boot插件专属的配置项来设置启动脚本的默认JVM参数,有两种常用方式:
方式1:通过springBoot全局扩展配置
在你的build.gradle(或build.gradle.kts)里添加:
// Groovy DSL springBoot { defaultJvmArgs = ['-Xmx512m', '-XX:+UseG1GC', '-Dmyapp.config=/etc/myapp'] }
// Kotlin DSL springBoot { defaultJvmArgs = listOf("-Xmx512m", "-XX:+UseG1GC", "-Dmyapp.config=/etc/myapp") }
这个配置会直接把参数写入boot分包里的启动脚本,作为默认JVM选项。
方式2:针对bootJar任务单独配置
如果只想给打包后的Jar启动脚本设置参数,可以直接配置bootJar的launchScript:
// Groovy DSL bootJar { launchScript { defaultJvmArgs = ['-Xmx512m', '-XX:+UseG1GC'] } }
// Kotlin DSL bootJar { launchScript { defaultJvmArgs.set(listOf("-Xmx512m", "-XX:+UseG1GC")) } }
为什么原生配置没用?
原生applicationDefaultJvmArgs是Gradle核心Application插件的配置,只对它生成的distTar/distZip分发包有效。而Spring Boot插件的bootDistTar/bootDistZip是独立实现的任务,不共享这个配置,所以必须用Spring Boot自己的参数配置项。
另外你提到脚本里提示可以用JAVA_OPTS和POCKETKNIFE_OPTS(应该是你项目的自定义环境变量前缀),这两种方式是运行时动态传参的途径,但如果想把固定默认参数写入脚本,上面的配置就可以解决你的问题。
内容的提问来源于stack exchange,提问作者phXql
相关产品推荐
相关产品推荐

