核心是通过maven profile配合资源过滤机制,在构建时自动将profile属性(如dev/prod)注入application.yml的spring.profiles.active=@deploy.type@占位符,使生成的jar包内嵌对应环境配置,避免手动修改;需严格匹配profile id、resources目录名(如resources.dev)及启用filtering。

核心是让构建过程自动注入对应环境的配置,而不是靠人手动改文件。关键在于 Maven 的 Profile + 资源过滤(filtering) 机制,在打包时就把 dev 或 prod 的配置“ baked in”,生成的 JAR 包里只含当前环境的配置,彻底避免运行时误激活。
1. 定义 Profile 并绑定环境变量
在 pom.xml 的 <profiles></profiles> 中声明环境标识,每个 profile 设置一个唯一 <id></id> 和对应的属性(如 deploy.type 或 environment):
-
<id>dev</id>,设<properties><deploy.type>dev</deploy.type></properties>,并加<activation><activebydefault>true</activebydefault></activation> -
<id>prod</id>,设<properties><deploy.type>prod</deploy.type></properties>
这样执行 mvn clean package -Pprod 就会激活生产 profile,${deploy.type} 的值就变成 prod。
2. 按环境组织资源目录
把配置按环境拆开存放,保持清晰和可维护:
-
src/main/resources/:放公共配置(如日志格式、通用 Bean 定义) -
src/main/resources.dev/:仅开发环境用的配置(如本地 H2 数据库、mock 接口地址) -
src/main/resources.prod/:仅生产环境用的配置(如远程 MySQL、Redis 地址、敏感参数占位符)
注意:这些目录名必须与 Profile 中定义的 ${deploy.type} 值严格一致(如 dev / prod),否则无法匹配。
3. 开启资源过滤并指定加载路径
在 <build></build> 中配置 <resources></resources>,启用 filtering,并按 profile 动态加载对应目录:
- 主资源目录始终加载:
<directory>src/main/resources</directory>,<filtering>true</filtering> - 环境专属目录动态加载:
<directory>src/main/resources.${deploy.type}</directory>,同样开启<filtering>true</filtering>
这样打包时,Maven 会把 resources 和 resources.prod(或 resources.dev)下的内容合并进最终的 classes 目录,且自动替换其中的 ${xxx} 占位符(比如数据库密码来自外部 .properties 文件)。
4. Spring Boot 主配置中激活对应 profile
在 src/main/resources/application.yml 里写死激活逻辑:
spring:
profiles:
active: @deploy.type@
配合 Maven 的 <resource><filtering>true</filtering></resource>,构建时 @deploy.type@ 就会被替换成 dev 或 prod,Spring 启动时自然加载 application-dev.yml 或 application-prod.yml(前提是它们放在主 resources 下,或通过上述目录结构已合并进来)。
不复杂但容易忽略:Profile 必须显式激活(命令行 -P 或 IDE 里选),且资源过滤和目录命名必须严格对应,少一个点或大小写错误都会导致配置丢失。











