命令行参数 --key=value 优先级最高,可直接覆盖配置属性;格式必须为双横线,如 --server.port=8081;系统属性 -dkey=value 次之;需注意命名规范与优先级链,生效后日志或 /actuator/env 可验证。

Spring Boot 支持在启动时用命令行参数直接覆盖配置文件中的属性,无需改代码、不碰配置文件,开箱即用。
用 --key=value 覆盖配置项
这是最常用也最优先的方式。参数必须以双横线(--)开头,格式为 --server.port=8081 或 --spring.profiles.active=prod。
- 启动 jar 包时直接追加:
java -jar app.jar --server.port=8081 --logging.level.root=debug - Maven 启动时需加参数:
mvn spring-boot:run -Dspring-boot.run.arguments="--server.port=8082" - 多个参数之间用空格分隔,顺序无关
- 注意不要写成单横线(如
-server.port),那会被 JVM 当作未知选项报错
用 -Dkey=value 设置系统属性
JVM 系统属性也能参与配置解析,但优先级低于 --key=value,高于 application.properties。
- 写法示例:
java -Dserver.port=8083 -Dspring.profiles.active=test -jar app.jar - 属性名要严格匹配 Spring Boot 的命名规范(如
spring.datasource.url,大小写敏感) - 适用于需要与 JVM 参数一起管理的场景,比如内存设置和配置共存:
java -Xmx512m -Dserver.port=8084 -jar app.jar
配置优先级必须清楚
命令行参数不是“一定生效”,它受整个外部化配置链影响。Spring Boot 按固定顺序加载并覆盖同名属性:
- 最低:类路径下的
application.properties或application.yml - 中层:外部 config 目录、环境变量(如
SERVER_PORT=9090)、-D系统属性 - 最高:命令行参数(
--key=value)——只要传入且格式正确,就一定会生效
若发现没覆盖成功,先检查是否被更高优先级的环境变量或测试配置意外覆盖。
验证是否生效
启动后看控制台日志最直接:
- Tomcat 启动行会明确显示端口,例如:
Tomcat started on port(s): 8081 (http) - 启用 Actuator 后访问
/actuator/env,搜索server.port,查看origin字段是否为commandLineArgs - 用
@Value("${server.port}")注入并在日志打印,确认运行时值











