Java -jar 启动程序参数说明
Springboot环境下的启动参数说明
# Java启动命令语法:
java [options] -jar file.jar [arguments]
java -jar [options] file.jar [arguments]
javaw [options] -jar file.jar [arguments] #javaw不会启动一个控制台窗口(启动失败的时候会弹出附有错误信息的窗口)
# 可选项(options)
# 程序参数(arguments)
# -jar 指定以 jar 包的形式执行一个应用程序
# 1、标准可选项(Standard options)
java -Dserver.port=8081 -jar app.jar #(系统参数)-Dxxx是java运行参数的语法,作用是配置一些环境变量
# -D 是java用来设置全局参数的,可覆盖yaml文件中的变量,但无法覆盖远程Nacos变量值
# --key=value 可覆盖Nacos,优先级最高
-Dspring.profiles.active
-Dspring.config.location # 指定打包后配置文件的路径
-Dfile.encoding=utf=8 # 设置字符集
-Djava.security.egd=file:/dev/./urandom # 可以一定程度上加快应用启动
-Dspring.config.additional-location=./application-dev.yml # 加载服务器配置文件
# 2、非标准可选项(Nonstandard Options)
java -Xms512m -Xmx1024m -jar app.jar
-Xms512m # JVM初始堆内存
-Xmx1024m # JVM最大堆内存
-XX:PermSize=256m # JVM初始非堆内存
-XX:MaxPermSize=512m # JVM最大非堆内存
# 3、程序参数(arguments)
java -jar app.jar a b c # (非选项参数)a,b,c参数就是jar包里主启动类中main方法的args参数,按顺序来
java -jar app.jar --server.port=8081 # (选项参数)其作用等价于在application.properties中的server.port=8081
--server.port=8081
--spring.profiles.active=dev
--spring.cloud.bootstrap.name=bootstrap-dev
--spring.cloud.nacos.config.server-addr=127.0.0.3:8848
查看更多启动命令
查看三种参数形式(系统参数/选项参数/非选项参数)
后台运行jar包且指定输出文件
# nohup 不挂断地运行命令;& 在后台运行,一般两个一起用:nohup command &
nohup java -jar app.jar >outlog.log 2>&1 &
>outlog.log # 覆盖原有内容
>>outlog.log # 将输出结果追加到文件末尾
# 在Linux系统中0 1 2是一个文件描述符:
标准输入(stdin) 0 # 0表示键盘输入
标准输出(stdout) 1 # 1表示屏幕输出
错误输出(stderr) 2 # 2表示错误输出
2>&1的含义:
将标准错误输出重定向到标准输出。
注意:符号>&是一个整体,不可分开,分开后就不是上述含义了。
cat test 2>&1 >file
错误输出到终端,标准输出被重定向到文件file。
cat test >file 2>&1
标准输出被重定向到文件file,然后错误输出也重定向到和标准输出一样,所以也错误输出到文件file。
command >out.file 2>&1 &
command > out.file是将command的输出重定向到out.file文件,输出内容不打印到屏幕上,而是输出到out.file文件中。2>&1是将标准出错重定向到标准输出,因为标准输出已经重定向到了out.file文件,所以标准出错也输出到out.file文件中。- 最后一个
&, 是让该命令在后台执行。
通俗的说,就是把所有标准输出和标准出错都输出到out.file文件。
command >/dev/null 2>&1 &
/dev/null:Linux的空设备,所有写入它的数据都会被丢弃。
程序参数(选项/非选项参数)
可以通过ApplicationArguments接口获取,选项参数也可以通过@Value在类中获取。
具体获取方法直接在使用参数的类中注入该接口即可
@RestController
public class ArgumentsController {
@Resource
private ApplicationArguments arguments;
@GetMapping("/args")
public void getArgs() {
System.out.println("# 非选项参数数量: " + arguments.getNonOptionArgs().size());
System.out.println("# 选项参数数量: " + arguments.getOptionNames().size());
System.out.println("# 非选项具体参数:");
arguments.getNonOptionArgs().forEach(System.out::println);
System.out.println("# 选项参数具体参数:");
arguments.getOptionNames().forEach(optionName -> {
System.out.println("--" + optionName + "=" + arguments.getOptionValues(optionName));
});
}
}
示例:
java -jar myapp.jar --server.port=8081 --label -- --input=-data.txt process --verbose
- 选项参数:--server.port=8081、--label。
- 非选项参数:-data.txt、process、--verbose。
--input=-data.txt 是一个 Spring Boot 应用中典型的选项参数写法,用于将值非选项参数(-data.txt)传递给选项参数 input。
若非选项参数以-开头,可能被误认为选项参数,可使用--强制结束选项解析。
在代码中,选项参数会自动注入到 Spring 环境,非选项参数需通过args手动解析。
启动项目配置源的加载顺序
# 启动服务后,各个配置文件的加载顺序为(bootstrap.yml的读取优先级最高):
1. 内置默认配置(Spring 框架默认值)
2. Nacos 远程配置(通过 EnvironmentPostProcessor 加载)
3. 本地配置文件(application.yml、application-dev.yml 等)
4. 环境变量(OS 环境变量)
5. 系统属性(JVM 参数,-Dxxx=xxx)
6. 命令行参数(--xxx=xxx)
远程配置默认情况会被标记为“最高权重”,所以默认情况nacos远程配置优先级最高。
核心差异:bootstrap.yml 属于启动引导阶段配置,由 Spring Cloud Bootstrap 模块加载(优先级最高),用于初始化应用上下文的核心配置(如连接配置中心、服务发现注册的基础信息等)。
以下配置项若在 bootstrap.yml 中定义,application.yml 则无法覆盖,原因是它们的生效依赖于 bootstrap 阶段的初始化逻辑,后续加载的 application.yml 已无法影响:
- 配置中心相关核心配置(spring.cloud.config.*)
- Bootstrap 自身配置(spring.cloud.bootstrap.*)
- 服务身份的核心标识(spring.application.name,eureka.instance.instance-id,...)
集成远程配置中心后优先级调整
在实际使用中,当集成了配置中心(如 Nacos、Apollo、Spring Cloud Config 等)时,远程配置的优先级默认确实是最高的,甚至会覆盖命令行参数、JVM 参数等本地配置源。
Spring Cloud 将 Nacos 这类远程配置中心的配置视为 “最高优先级的外部配置源”,目的是确保配置中心的集中管理能力,避免本地参数(包括程序参数)随意覆盖远程配置,导致配置失控。
具体优先级调整(以 Nacos 为例)
默认情况下,集成 Nacos 后的优先级顺序是:
Nacos远程配置 > 命令行参数 > JVM参数 > 环境变量 > 本地配置文件
如果需要让本地参数(如命令行)覆盖远程配置,必须显式开启 “本地覆盖权限”,在nacos远程配置(非bootstrap.yml)中添加配置:
spring:
cloud:
nacos:
# Spring Cloud 2023.x,对配置加载机制进行了重构,新版本配置覆盖策略
config:
# 是否允许本地配置和系统属性(如命令行参数/JVM参数/环境变量)覆盖远程配置,默认false
override-none: true
在 Spring Cloud 2023.x 及以后版本,override-system-properties 参数已被废弃且不再生效,在旧版本中该参数表示是否允许外部配置(如远程配置或本地配置)覆盖系统属性(如命令行参数、JVM参数、环境变量),默认为true
这就导致了一个矛盾:单纯通过 override-none 无法同时实现 "允许系统属性覆盖远程配置,但不允许本地配置覆盖远程配置" 的需求。
开启后,优先级会调整为:
命令行参数 > JVM参数 > 环境变量 > 本地配置文件 > Nacos远程配置
实际场景我们不大可能做出以上优先级调整,存在在较大风险,也违背了远程配置的设计初衷;但是在实际应用中,也会遇到想通过启动参数去临时覆盖远程配置属性来调试程序,可以通过以下方式来解决问题,如下:
通过选项参数传入变量值:-DPORT=8088
server:
port: ${PORT:8080}
特殊场景:远程配置中的 “强制不被覆盖”
部分配置中心(如 Apollo)支持在远程配置中标记 “某些参数不允许被本地覆盖”,例如:
# Apollo远程配置中
server.port=8080
# 标记该参数强制生效,不允许本地覆盖
server.port.apollo.override=false
此时,即使开启了本地覆盖权限,server.port仍会以远程配置为准。
指定外部自定义配置文件
Springboot 启动时会扫描以下位置的application.properties或者application.yml文件作为Spring boot的默认配置文件。
file:./config/application.yml # 外部当前目录下的/config子目录
file:./application.yml # 外部当前目录
classpath:/config/application.yml # 内置类路径下的/config目录:/resources/config/application.yml
classpath:/application.yml # 内置类路径根目录:/resources/application.yml
优先级由高到低,高优先级的配置会覆盖低优先级的配置。即执行顺序由下往上。
Spring Boot会按照指定的顺序加载配置文件。因此,在覆盖配置时,请确保覆盖的配置文件在指定的位置之后加载。
注意事项:
例如执行:java -jar /data/soft/sbin/app.jar(若不是在app.jar目录执行,就算创建了外部配置文件也不会生效)
则必须先:cd /data/soft/sbin && java -jar app.jar
在部署Java项目时,指定外部的/config/bootstrap.yml 文件,那么这个外部文件中的配置会优先于内置的resources/bootstrap.yml文件中的配置被加载和应用。也就是说,如果两者中有任何冲突的配置,外部文件中的配置将会覆盖内置文件中的配置。
指定自定义配置文件
java -jar myproject.jar -Dspring.config.location=file:/data/soft/config/application.yml
多配置文件加载:若需加载多个外部配置,用逗号分隔路径
java -jar myproject.jar --spring.config.location=file:/data/soft/config1.yml,file:/data/soft/config2.yml
附加配置(不覆盖内部配置)
java -jar myproject.jar --spring.config.additional-location=file:/data/soft/additional-config/config3.yml
使用idea设置参数

-
VM options 需要以 -D 或 -X 或 -XX 开头,每个参数最好使用空格隔开。
-
Program arguments 每个参数需要以空格隔开。否则将会被识别成一个参数,自己用的时候还得手动处理。
-
Environment variable 没有前缀,优先级低于 VM options ,即如果VM options 有一个变量和 Environment variable中的变量的key相同,则以VM options 中为准,(如果用命令行启动,这个参数需要在运行java类以前使用 set JAVA_HOME=D:\jdk1.8.0_05 这种方式进行临时修改,这种方式只在当前cmd窗口有效,点击看详情 设置临时的java环境变量)。
配置公共的Java程序启动参数
当微服务项目有多个模块时,本地Idea需要切换Nacos环境地址进行运行调试,正常情况需要修改全部模块的bootstrap.yml文件关于nacos的相关配置,此时操作就相当繁琐;这时候可以通过一个公共配置文件来处理当前问题。步骤如下:
1.创建外部文件(.env)定义环境变量
SPRING_CLOUD_NACOS_USERNAME=nacos
SPRING_CLOUD_NACOS_PASSWORD=123456
SPRING_CLOUD_NACOS_CONFIG_NAMESPACE=test
SPRING_CLOUD_NACOS_CONFIG_SERVER_ADDR=127.0.0.1:8848
2.在每个模块的运行/调试界面添加环境变量
| 文件类型 | 示例 | 说明 |
|---|---|---|
| *.env | d:/data/test.env | 手动选择指定的配置文件 |
环境变量命名规则
环境变量通常使用全大写和下划线分隔(如 SERVER_PORT),Spring Boot 会自动将其转换为标准属性名:
- 大写转换为小写,下划线转换为点:SERVER_PORT → server.port
- 自动匹配横杠(-)配置属性:SPRING_CLOUD_NACOS_CONFIG_SERVER_ADDR → spring.cloud.nacos.config.server-addr
- 数组格式使用下标配置属性:
MY_SERVERS_0=auth
MY_SERVERS_1=usermy: servers: - auth - user
单下划线(_)与双下划线(__)差异
一、多层嵌套属性(本质差异)
spring.cloud.nacos.config.server-addr(四层嵌套:spring → cloud → nacos → config → server-addr,包含 - 连接符)
| 环境变量写法 | 解析结果 | 正确性 | 原因分析 |
|---|---|---|---|
SPRING_CLOUD_NACOS_CONFIG_SERVER_ADDR(单下划线) |
spring.cloud.nacos.config.server-addr(表面正确) |
巧合正确 | 单下划线被逐个转为 . 或 -,但语义错误(config 与 server-addr 被错误视为同级,未体现层级关系)。 |
SPRING_CLOUD_NACOS__CONFIG__SERVER_ADDR(双下划线) |
spring.cloud.nacos.config.server-addr(正确) |
✅ 正确 | 双下划线 __ 明确分隔层级(nacos → config → server-addr),server_addr 中的单下划线转为 -,符合属性命名规则。 |
二、混合嵌套与 - 属性(表面和本质均不同)
my.app.redis.connection-timeout(三层嵌套:my → app → redis → connection-timeout,含 - 连接符)
| 环境变量写法 | 解析结果 | 正确性 | 原因分析 |
|---|---|---|---|
MY_APP_REDIS_CONNECTION_TIMEOUT(单下划线) |
my.app.redis.connection-timeout(表面正确) |
巧合正确 | 单下划线被转为 . 和 -,但语义错误(redis 与 connection-timeout 被错误视为同级,未体现嵌套关系)。 |
MY_APP__REDIS__CONNECTION_TIMEOUT(双下划线) |
my.app.redis.connection-timeout(正确) |
✅ 正确 | 双下划线 __ 分隔层级(app → redis → connection-timeout),CONNECTION_TIMEOUT 中的单下划线转为 -,符合属性命名规则。 |
三、复杂嵌套结构(彻底暴露差异)
spring.security.oauth2.client.registration.github.client-id(五层嵌套:spring → security → oauth2 → client → registration → github → client-id)
| 环境变量写法 | 解析结果 | 正确性 | 原因分析 |
|---|---|---|---|
SPRING_SECURITY_OAUTH2_CLIENT_REGISTRATION_GITHUB_CLIENT_ID(单下划线) |
spring.security.oauth2.client.registration.github.client-id(表面正确) |
❌ 错误 | 单下划线被转为 .,但语义错误(registration 与 github 被错误视为同级,未体现 github 是 registration 的子属性)。 |
SPRING_SECURITY__OAUTH2__CLIENT__REGISTRATION__GITHUB__CLIENT_ID(双下划线) |
spring.security.oauth2.client.registration.github.client-id(正确) |
✅ 正确 | 双下划线 __ 明确分隔层级(security → oauth2 → client → registration → github → client-id),完整体现嵌套关系。 |
四、数组/列表属性(层级与索引的区别)
my.servers[0].host(数组索引+嵌套:my → servers[0] → host)
| 环境变量写法 | 解析结果 | 正确性 | 原因分析 |
|---|---|---|---|
MY_SERVERS_0_HOST(单下划线) |
my.servers[0].host(表面正确) |
巧合正确 | 单下划线被转为 . 和 [],但语义错误(servers 与 0 被错误视为同级,未体现数组索引与父属性的层级关系)。 |
MY_SERVERS__0__HOST(双下划线) |
my.servers[0].host(正确) |
✅ 正确 | 双下划线 __ 分隔层级(servers → 0 → host),0 被正确解析为数组索引,体现 servers 与索引的父子关系。 |
结论:核心差异总结
| 符号 | 本质语义 | 正确用法场景 |
|---|---|---|
单下划线 _ |
属性名内部的连接符 | 替代属性名中的 -(如 server-addr → SERVER_ADDR)。 |
双下划线 __ |
属性层级的分隔符 | 表达嵌套关系(如 spring.redis.host → SPRING_REDIS__HOST)。 |
关键原则:
- 层级用
__(双下划线),连接用_(单下划线),避免依赖“巧合正确”的解析结果,确保配置语义清晰。
获取系统参数的方法
java提供了System类的静态方法getenv()和getProperty()用于返回系统相关的变量与属性。
-
getProperty() 方法返回的变量大多与java程序有关。
-
System.getenv() 方法是获取指定的环境变量的值。
-
System.getenv(String name) 接收参数为任意字符串,当存在指定环境变量时即返回环境变量的值,否则返回null。
-
System.getProperty() 是获取系统的相关属性,包括文件编码、操作系统名称、区域、用户名等,此属性一般由jvm自动获取,不能设置。
-
System.getProperty(String key) 接收参数为任意字符串,当存在指定属性时即返回属性的值,否则返回null。

浙公网安备 33010602011771号