Java项目运行参数配置关键在于位置与优先级:IDEA中VM Options仅影响当前启动;Maven需用exec-maven-plugin的systemProperties/jvmArgs;Spring Boot中-D参数优先于application.properties;生产环境应通过systemd或启动脚本固化参数。

Java项目运行参数直接决定JVM行为、内存分配和系统属性,配置错误会导致OutOfMemoryError、类加载失败或环境变量不生效等问题。关键不在“怎么填”,而在于“在哪填”和“谁优先级更高”。
IDEA中配置Run/Debug Configurations的VM Options
这是开发阶段最常用也最容易混淆的位置。它只影响当前启动配置,不修改项目源码或构建脚本。
-
VM Options框内填写JVM参数,如:-Xms512m -Xmx2g -Dfile.encoding=UTF-8 -Dspring.profiles.active=dev - 注意:不能写
java -jar xxx.jar这类命令,只写-X、-D、-XX开头的参数 - 多个参数用空格分隔,含空格的值(如路径)必须用英文双引号包裹:
-Dlog.path="/var/log/myapp" - 该配置会被Maven/Gradle插件的
exec:java或bootRun忽略——它们走的是各自插件配置
Maven项目中通过exec-maven-plugin传参
适用于用mvn exec:java直接运行主类的场景,参数作用于插件执行过程,而非最终打包产物。
- 在
pom.xml中配置插件时,用或传参 -
对应-Dkey=value,对应程序主方法的String[] args - 示例片段:
org.codehaus.mojo exec-maven-plugin com.example.App spring.profiles.active test
注意:exec:java不支持-Xmx等JVM堆参数,要用单独配置。
立即学习“Java免费学习笔记(深入)”;
Spring Boot应用的application.properties vs JVM参数
很多人误以为spring.profiles.active只能写在配置文件里,其实它本质是系统属性,-Dspring.profiles.active=prod和application.properties中写效果一致,但优先级不同。
- JVM参数
-Dxxx>application.properties>application.yml -
server.port这类配置项,如果同时出现在-Dserver.port=8081和application.properties中,以JVM参数为准 - 但
spring.config.location这种指定配置文件路径的参数,必须用-D方式传入,否则无法提前加载外部配置 - 打包成
jar后,推荐用java -D... -jar app.jar方式启动,而不是改内部配置文件
Linux服务化部署时的systemd或startup.sh参数控制
生产环境脱离IDE,参数必须固化在启动脚本或服务定义中,此时容易遗漏EnvironmentFile或User权限导致的环境变量不可见问题。
-
systemd服务文件中,用Environment=设置环境变量,用ExecStart=拼接完整命令 - 不要在
ExecStart里写多行或复杂逻辑;把JVM参数提取到独立变量更安全 - 示例
/etc/systemd/system/myapp.service片段:
[Service] Type=simple User=myapp WorkingDirectory=/opt/myapp Environment="JAVA_HOME=/usr/lib/jvm/java-17-openjdk" Environment="JVM_OPTS=-Xms1g -Xmx4g -XX:+UseG1GC -Dlog.path=/var/log/myapp" ExecStart=/bin/sh -c 'exec $JAVA_HOME/bin/java $JVM_OPTS -jar /opt/myapp/app.jar'
注意:systemd默认不继承登录用户的~/.bashrc,所有路径、变量必须显式声明;$JVM_OPTS必须用双引号包裹变量名才能正确展开。
最常被忽略的一点:不同启动方式下,System.getProperty("user.dir")和System.getProperty("java.class.path")的值可能完全不同,调试时务必先打印这两个值,再判断参数是否真的加载成功。










