前言
在企业级项目中,开发、测试、生产环境差异巨大。合理管理配置文件可以提高部署效率、降低风险,同时保证敏感信息安全。本文总结了多环境配置规范、profile 激活逻辑及部署注意事项。
一、多环境的概念
-
开发环境 (dev)
- 本地开发使用,方便调试
- 数据库、缓存、日志等均可使用本地或模拟环境
-
测试环境 (test / staging)
- 模拟生产环境,用于集成测试和业务验证
- 数据库、消息队列等接近生产环境,但使用测试账户
-
生产环境 (prod)
- 真实用户访问环境
- 高可用、高安全要求
- 配置敏感信息(数据库密码、AES key、私钥)
不同环境的配置通常差异很大,如果把生产配置打包进 jar,会带来安全隐患,也不便于环境切换。
二、Spring Boot 配置文件管理原则
- 资源目录 (
resources/)
-
存放 开发默认配置和 dev profile 配置
-
打包 jar 时会被包含
-
可作为本地开发和调试的兜底值
-
核心原则:
application.yml中应包含应用启动必需的所有配置(数据库连接、缓存、日志、核心组件等)application-{profile}.yml只放与默认配置不同的差异化配置(例如数据库账号、Druid 连接池参数、调试模式等)- 这样即使某个 profile 文件缺失,Spring Boot 仍能用默认配置启动,避免启动失败
示例:
resources/
├── application.yml # 默认配置(所有启动必需参数 + dev 默认值)
├── application-dev.yml # 本地开发差异配置(可选,只覆盖默认配置)
└── logback-spring.xml # 日志配置
- 外部配置目录 (
/config)
- 存放 生产/测试环境配置和敏感信息
- 可以覆盖 jar 内默认配置
- 支持 profile 分层加载
- 不打包进 jar,部署时单独管理
-
单体多模块项目配置文件层级示例:
项目根目录/
├── module-a/ # 模块 A(代码)
│ └── src/main/java/
├── module-b/ # 模块 B(代码)
│ └── src/main/java/
├── common/ # 公共模块(代码/工具类)
│ └── src/main/java/
├── main-app/ # 主模块,最终打成可执行 jar
│ ├── src/main/java/
│ └── src/main/resources/ # 配置集中放这里
│ ├── application.yml # 默认配置(dev / 通用默认值)
│ ├── application-dev.yml # 本地开发专用(可选)
│ └── logback-spring.xml # 日志配置
├── config/ # 外部部署配置(生产/测试环境)
│ ├── application-prod.yml # 生产环境差异配置
│ ├── application-test.yml # 测试环境差异配置
│ ├── application-druid.yml # 技术组件配置(如 Druid 连接池)
│ ├── SecretAESKey.txt # AES 密钥
│ ├── private-prod.pem # 私钥
│ └── public-prod.pem # 公钥
├── logs/ # 日志目录(外部,不打包进 jar)
├── pom.xml # 父模块 Maven 配置
└── bin/ # 启动/停止脚本
├── run.sh
└── stop.sh
原则:敏感信息和生产环境配置不打包进 jar,只放外部配置
三、Profile 激活与覆盖逻辑
Spring Boot 的配置加载顺序(简化版):
- Jar 内 resources/application.yml
- Jar 内 resources/application-{profile}.yml(根据激活 profile)
- 外部 config/application.yml
- 外部 config/application-{profile}.yml(覆盖 jar 内默认)
- 命令行参数
--spring.profiles.active或--spring.config.location(最高优先级)
示例场景
假设 jar 内配置:
yaml
# resources/application.yml
spring:
profiles:
active: dev
server:
port: 8080
外部 config:
config/application-prod.yml
config/application-druid.yml
启动命令(生产环境):
bash
java -jar app.jar \
--spring.profiles.active=prod,druid \
--spring.config.location=file:/opt/app/config/
加载逻辑:
- dev profile 被 jar 内默认激活,但命令行指定了 prod,druid → dev 被覆盖
/config/application-prod.yml和/config/application-druid.yml生效- jar 内的 dev 配置完全不影响生产
注意:如果外部 config 中没有对应 profile 文件,Spring Boot 不会报错,仍使用默认值
四、本地开发与敏感信息处理
- 外部配置在本地缺失不会阻塞开发
- 如果外部
/config下只有生产密钥(AES、私钥),IDEA 本地启动不会使用这些文件 - 可以在
resources或本地/config放开发用测试密钥
示例:
yaml
# application-dev.yml
aes:
key-file: classpath:SecretAESKey-dev.txt
- profile 激活仅影响加载文件,不会导致启动失败
- jar 内没有
application-test.yml或application-prod.yml不会报错 - Spring Boot 会 fallback 使用
application.yml中默认值
五、部署规范与注意事项
- 打包 jar 时
- 不修改
resources/application.yml的 profile - 保持开发默认配置即可
- 生产部署
- jar + 外部
/config目录一起上传到服务器 - 启动时通过命令行指定 profile 和 config 位置
- 配置文件注意点
- 生产敏感信息不打包入 jar
- 外部 config 支持多环境切换(dev/test/prod)
- 日志目录单独配置,不写到 jar 内
- 使用启动脚本记录 PID,方便停止应用
- 外部 config 文件可随时修改,无需重新打包 jar
-
示例部署目录结构
/opt/app/project-backend/
├── app.jar
├── config/ # 外部环境配置
│ ├── application-prod.yml
│ ├── application-druid.yml
│ ├── SecretAESKey.txt
│ └── private-prod.pem
├── logs/ # 日志文件
├── run.sh # 启动脚本
└── stop.sh # 停止脚本
启动命令示例:
bash
cd /opt/app/project-backend
nohup java -jar app.jar \
--spring.profiles.active=prod,druid \
--spring.config.location=file:./config/ \
> ./logs/console.log 2>&1 &
六、总结
- resources:开发默认配置、dev profile
- 外部 config:生产/测试环境差异 + 敏感信息
- profile 激活:jar 默认值 → 外部 config 覆盖 → 命令行覆盖
- 安全:敏感信息不打包入 jar
- 部署:jar + config + 启动脚本 → 一次打包,多环境可复用
✅ 好处:安全、灵活、可维护,生产环境修改配置无需重打包 jar