Spring-Profile与部署说明

Spring Profile 与部署说明

本文档说明 Spring Boot 激活环境(profile) 的生效方式、优先级,以及 Docker Compose 部署 时环境变量的传递机制。


一、spring.profiles.active 的优先级(从高到低)

Spring Boot 确定「当前激活的 profile」时,按以下顺序取第一个有值的来源

优先级 来源 说明
1(最高) 程序参数 运行配置中的 --spring.profiles.active=xxx,或 IDE 的 Active profiles(会转成程序参数)
2 JVM 参数 VM options 中的 -Dspring.profiles.active=xxx
3 环境变量 操作系统/进程环境变量 SPRING_PROFILES_ACTIVE=xxx(如 Docker Compose 的 environment
4 配置文件 application.properties / application.yml 中的 spring.profiles.active=xxx
5(最低) 未设置 以上都未配置时,无激活 profile 或按框架约定视为 default

同一种来源内,先被读取到的生效;高优先级会覆盖低优先级。


二、指定激活环境的几种方式

方式 典型场景
1. IDE 运行配置 在 Run Configuration 的 Active profilesdev / test / prod,或 Program arguments 填 --spring.profiles.active=dev
2. VM options 运行配置中 VM options 填 -Dspring.profiles.active=dev
3. 环境变量 系统或容器环境变量 SPRING_PROFILES_ACTIVE=dev(Docker Compose 即此类)
4. 配置文件 application.propertiesapplication.yml 中写 spring.profiles.active=dev
5. Maven + 插件 使用 Maven 运行配置执行 spring-boot:run,由 POM 中 <arguments>--spring.profiles.active=${application.environment}</arguments> 传入,此时 Maven 勾选的 profile 会生效

三、IDE 直接运行 vs Maven 运行

  • 直接点运行主类 (Spring Boot / Application 运行配置):

    不会执行 Maven,因此 不会 使用 Maven 的 profile 或 POM 里 spring-boot-maven-plugin<arguments>

    激活环境由 运行配置里的 Active profiles / Program arguments 或上面优先级表中的 2~5 决定。

  • 用 Maven 运行配置 (执行 spring-boot:run):

    会执行 Maven, 使用当前勾选的 Maven profile 和 POM 中的
    <arguments>--spring.profiles.active=${application.environment}</arguments>

    即「勾选 Maven 的 profile → 点运行」即可切换 Spring 的激活环境。


四、Docker Compose 中 SPRING_PROFILES_ACTIVE 如何传递

4.1 在优先级中的位置

Docker Compose 的 environment 会变成容器内的环境变量 ,对应上表中的 优先级 3

若未在启动命令中传入程序参数或 JVM 参数,则会使用这里的 SPRING_PROFILES_ACTIVE

示例:

yaml 复制代码
your-app:
  image: your-app:latest
  environment:
    SPRING_PROFILES_ACTIVE: test
    SPRING_CLOUD_NACOS_SERVER_ADDR: nacos:8848

4.2 传递链路

复制代码
docker-compose 的 environment
    ↓
容器进程的环境变量(如 export SPRING_PROFILES_ACTIVE=test)
    ↓
容器内启动的 Java 进程(如 java -jar app.jar)继承该环境
    ↓
Spring Boot 启动时按「宽松绑定」规则读取环境变量
    ↓
SPRING_PROFILES_ACTIVE → 映射为 spring.profiles.active → 激活对应 profile(如 test)
  • 宽松绑定 :环境变量大写+下划线(SPRING_PROFILES_ACTIVE)自动对应配置项小写+点号(spring.profiles.active),无需在代码中手写读取逻辑。

五、Docker Compose 部署需要哪些文件

文件 是否必须 作用
docker-compose 文件 必须 定义服务如何运行:镜像、端口、环境变量、依赖服务(如配置中心、数据库)等;执行 docker compose up 时使用。
Dockerfile 必须(若自建镜像) 定义如何将应用打成镜像(如 JDK、jar、启动命令);image: your-app:latest 需通过 Dockerfile 构建或从仓库拉取。
Jenkinsfile 非必须 用于 Jenkins CI/CD 流水线(编译、构建镜像、推送、部署);仅在使用 Jenkins 做自动化时需要,与「能否用 docker compose 启动」无直接关系。

结论 :仅就「用 Docker Compose 启动应用」而言,需要 Dockerfile + docker-compose 文件;Jenkinsfile 仅在采用 Jenkins 做流水线时才需要。


六、常见配置文件约定

  • bootstrap.properties / application.properties:公共配置(如配置中心、注册中心地址等)。
  • bootstrap-{profile}.properties / application-{profile}.properties :按 profile 区分的环境配置,例如:
    • bootstrap-dev.properties(本地开发)
    • bootstrap-test.properties(测试)
    • bootstrap-prod.properties(生产)

激活的 profile 决定加载哪一个 *-{profile}.properties

相关推荐
小雅痞3 小时前
[Java][Leetcode middle] 167. 两数之和 II - 输入有序数组
java·算法·leetcode
CN-Dust3 小时前
【C++】输入cin例题专题
java·c++·算法
xin_nai4 小时前
LeetCode热题100(Java)(6)矩阵
java·leetcode·矩阵
代码AI弗森9 小时前
一文理清楚“算力申请 / 成本测算 / 并发评估”
java·服务器·数据库
Old Uncle Tom10 小时前
OpenClaw 记忆系统 -- 记忆预加载
java·数据结构·算法·agent
小小小米粒10 小时前
Collection单列集合、Map(Key - Value)双列集合,多继承实现。
java·开发语言·windows
前端一小卒10 小时前
我用 Claude Code 的 Superpowers 技能链写了个服务,部署前差点把服务器搞炸
前端·javascript·后端
摇滚侠10 小时前
expdp 查看帮助
java·数据库·oracle
:12111 小时前
java基础
java·开发语言
曹牧12 小时前
Spring:@RequestMapping注解,匹配的顺序与上下文无关
java·后端·spring