Spring Boot 命令行参数覆盖
命令行参数是Spring Boot最高优先级的配置来源,可覆盖所有其他配置。
参数格式
标准格式
Bash
java -jar app.jar --server.port=8081 --spring.profiles.active=prod
# 格式:--key=value
# key支持松散绑定:server.port、server_port、SERVER_PORT
简写格式
Bash
# 部分属性支持简写
java -jar app.jar --port=8081 # 等同于 --server.port=8081
参数传递方式
直接传递
Bash
java -jar app.jar --server.port=8081 --my.feature.enabled=true
通过脚本
Bash
# start.sh
java -jar app.jar \
--server.port=8081 \
--spring.datasource.url=jdbc:mysql://prod-db:3306/mydb
通过环境变量传递
Bash
# 环境变量转换为命令行参数格式
export SERVER_PORT=8081
java -jar app.jar
优先级
命令行参数优先级最高,覆盖所有其他配置来源:
| 优先级 | 配置来源 |
|---|---|
| 1 | 命令行参数 |
| 2 | Java系统属性 |
| 3 | 环境变量 |
| 4 | 外置application.yml |
| 5 | 内置application.yml |
参数解析
Java
// SpringApplication.run()
public ConfigurableApplicationContext run(String... args) {
// DefaultApplicationArguments解析命令行参数
ApplicationArguments applicationArguments =
new DefaultApplicationArguments(args);
// 分离:
// - 属性参数:--key=value(写入Environment)
// - 非属性参数:其他参数(保留为原始参数)
}
Bash
# 属性参数:写入Environment,可覆盖配置
--server.port=8081
# 非属性参数:不写入Environment,保留原始值
custom-argument
--debug # 无value的参数
获取命令行参数
Java
@Component
public class MyComponent {
@Autowired
private ApplicationArguments arguments;
public void process() {
// 获取非属性参数
List<String> nonOptionArgs = arguments.getNonOptionArgs();
// 获取属性参数
Set<String> optionNames = arguments.getOptionNames();
List<String> port = arguments.getOptionValues("server.port");
}
}
禁用命令行参数
Java
// 方式一:SpringApplicationBuilder
new SpringApplicationBuilder(App.class)
.addCommandLineProperties(false)
.run(args);
// 方式二:设置系统属性
System.setProperty("spring.command-line-properties.enabled", "false");
命令行参数转换
Bash
# 数组/集合
--my.values=val1,val2,val3
# 嵌套属性
--spring.datasource.username=root
Java
@ConfigurationProperties(prefix = "my")
public class MyProperties {
private List<String> values; // 自动解析为List
}
常见使用场景
| 场景 | 示例 |
|---|---|
| 端口配置 | --server.port=8081 |
| Profile激活 | --spring.profiles.active=prod |
| 配置覆盖 | --spring.datasource.url=jdbc:mysql://... |
| 调试模式 | --debug |
| 日志级别 | --logging.level.root=DEBUG |
注意事项
Bash
# 参数值含空格需用引号
java -jar app.jar --my.message="Hello World"
# 参数值含特殊字符需转义
java -jar app.jar --my.password='p@ss\!word'
要点总结
- 命令行参数格式:--key=value
- 命令行参数优先级最高
- 属性参数写入Environment,非属性参数保留原始值
- 通过ApplicationArguments获取参数
- 可禁用命令行参数覆盖配置
- 松散绑定支持多种命名格式
📝 发现内容有误?点击此处直接编辑