一、SpringBoot项目部署


二、Springboot属性配置方式
需求:项目打包完成后,需要修改端口号

一般是通过配置文件:application.yml修改的,但是一般项目打包好后,就不能修改了。
方式一:命令行参数方式

方式二:环境变量方式

SpringBoot jar 在启动的时候,会自动读取所在系统的环境变量。
也就是说:
-
你在 Windows 本地启动 → 读 Windows 的环境变量
-
你把 jar 放到 Linux 服务器 启动 → 读 服务器的环境变量
它不会读你电脑的环境变量跑到服务器去 ,只会读 运行它的那台机器的环境变量。
1、系统环境变量在哪里被读取?
SpringBoot 在启动的时候会按优先级读取:
| 优先级高 → 低 | 来源 | 示例 |
|---|---|---|
| 1 | 启动命令参数 | java -jar app.jar --server.port=9999 |
| 2 | 系统环境变量 | DB_PWD=xxx |
| 3 | 外部配置文件application.yml / properties | 配置文件写死的 |
| 4 | 项目内部resources下的配置文件 |
所以:
配置越"靠上",优先级越高,就会覆盖下面的。
2、springboot读取环境变量的底层逻辑
具体负责这件事的是:
java
org.springframework.boot.context.config.ConfigDataEnvironment
在 Spring Boot 启动过程中,这段代码会自动去收集所有可用的配置源,包括:
-
application.yml / properties -
application-xxx.yml -
系统环境变量
-
JVM 启动参数(
--server.port=8081) -
操作系统 Shell 环境变量(
export DB_PWD=abc123) -
.env文件 -
Spring Cloud Config 等(可选)
3、真正触发读取环境变量的代码位置(底层)
Spring Boot 的主入口:
java
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
这个 .run() 里面会:
→ 创建 ConfigurableEnvironment
→ 调用 applyToEnvironment()
→ 然后 ConfigDataEnvironment 去解析所有配置源
→ 包括 环境变量
关键类:
org.springframework.boot.SpringApplication
org.springframework.boot.context.config.ConfigDataEnvironment
org.springframework.boot.context.config.ConfigDataEnvironmentPostProcessor
关键接口:
Environment
PropertySource
4、举个例子
假设你在服务器上运行:
export DB_PWD=abc123
java -jar app.jar
你的 application.yml:
spring:
datasource:
password: ${DB_PWD}
你没有写任何 java 代码来取环境变量,对吧?
但是 Spring Boot 启动后:
Environment → 发现存在系统变量 DB_PWD → 解析占位符 ${DB_PWD} → 注入到 DataSource
这就是为什么你不用写:
System.getenv("DB_PWD")
因为 Spring Boot 框架已经帮你自动做了。
5、高级了解
内部调用链(简化):
SpringApplication.run()
→ prepareEnvironment()
→ StandardEnvironment
→ MutablePropertySources
→ addLast(systemEnvironment)
也就是说 系统环境变量变成了 PropertySource ,你项目里所有 @Value / ${} / @ConfigurationProperties 都能直接用。
6、总结
Spring Boot 在启动时自动把环境变量加入配置系统中。你只要在配置文件中写
${变量名}就能使用。
方式三:springboot读取外部配置文件(推荐)
这是 Spring Boot 在生产环境最常用、最推荐的做法。
Spring Boot 可以在启动时自动读取外部配置文件。
这样你就不需要把数据库密码、Redis 密码、API 密钥等写死在 application.yml 里。
1、外部配置文件可以放在哪里?
Spring Boot 默认会按顺序查找配置文件(优先级由高到低):
| 优先级 | 配置文件位置 | 示例路径 |
|---|---|---|
| 最高 | 启动命令指定的位置 | --spring.config.location=/opt/app/config/ |
| JAR 包同级目录 | /opt/app/application.yml |
|
| 项目内部 resources 目录 | src/main/resources/application.yml |
记住一句话:
jar 外面的配置,会覆盖 jar 里面的配置。
2、最常用、最实战的方式(推荐)
1)本地打包时不用改配置
你正常保留默认的:
src/main/resources/application.yml
2)在服务器创建一个外部配置目录
例如:
/opt/app/myapp/
├─ myapp.jar
└─ application-prod.yml ← 外部配置文件
示例:

3)让 Spring Boot 读取这个文件
启动命令这样写:
java -jar myapp.jar --spring.config.location=/opt/app/myapp/application-prod.yml
或者(更推荐,更灵活):
java -jar myapp.jar --spring.config.additional-location=/opt/app/myapp/
意思是:
"兄弟你去
/opt/app/myapp/目录再找一遍配置文件。"
3、外部配置文件里写什么?
比如 application-prod.yml:
server:
port: 8081
spring:
datasource:
url: jdbc:mysql://127.0.0.1:3306/demo
username: root
password: ${DB_PWD} # 环境变量
redis:
host: 127.0.0.1
port: 6379
logging:
file:
name: /opt/app/myapp/logs/app.log
注意:我们把密码用 环境变量 替代,安全又规范。
4、启用对应 profile
如果你想区分开发 / 测试 / 生产:
内置文件:
application.yml
application-dev.yml
application-prod.yml
启动时:
java -jar myapp.jar --spring.profiles.active=prod
prod 就是使用 application-prod.yml
5、最推荐的"生产部署三件套"(企业标准)
| 配置内容 | 存放位置 | 含义 |
|---|---|---|
application.yml |
JAR 内 | 默认/公共配置 |
application-prod.yml |
服务器外部 | 生产环境配置(数据库等) |
| 环境变量 | 服务器 | 保存密码和敏感数据 |
这样做的好处:
✅ 代码和配置彻底分离
✅ 密码不写进 Git,不会泄露
✅ 服务器不需要改 jar,只改外部配置
✅ 部署升级更安全、可复用性更高
三、Spring Boot 中的"多环境配置方案"
Profiles = Spring Boot 中的"多环境配置方案"
用来解决:
开发环境、测试环境、生产环境 用的配置不一样 怎么办?
比如:
| 环境 | 数据库 | 日志级别 |
|---|---|---|
| 开发(dev) | 本地 MySQL | debug |
| 测试(test) | 测试服务器 MySQL | info |
| 生产(prod) | 正式服务器 MySQL | warn |
Profiles 就是用来区分和切换这些配置的。
3-1、使用同一个配置文件

示例:

特定环境中的配置和通用信息冲突了,特定环境下的配置生效!
3-2、使用多个配置文件
示例:

创建多个配置文件,每个文件属于一个环境。

1、如何指定当前使用哪个环境的配置?


3-3、Profiles-分组
前面我们学过:
-
application-dev.yml是一个环境配置文件 -
application-prod.yml是另一个环境配置文件
但是, 有时候一个环境里面的配置会很多、很杂、很长,比如:
| 配置内容 | 都写在 application-dev.yml 中会变成: |
|---|---|
| 服务器配置 | server.port |
| 数据库配置 | spring.datasource... |
| 日志配置 | logging... |
| 自定义配置 | zyd.xxx... |
如果全部写在 application-dev.yml,文件会变得又大又乱,不好维护。
所以,Spring Boot 允许我们:把同一个环境的配置再分拆成多个文件 ,比如 开发环境(dev) 下:
| 配置文件名 | 用来存什么 |
|---|---|
application-devServer.yml |
存服务器相关配置(端口等) |
application-devDB.yml |
存数据库配置 |
application-devSelf.yml |
存自定义业务配置 |
也就是说:
·
这叫做 Profile 组 或 分组配置。
1、文件结构图:


2、激活方式:
示例:

或者:

3、小结
