Spring Boot 多环境配置与切换
当在多配置文件中,需要切换配置文件时,通常的做法都是修改激活的文件名称,而spring.profiles.active=@profiles.active@
是配合maven profile
进行选择不同配置文件进行启动,可以避免修改文件,而在maven
打包是指定使用哪个配置文件。
1. 配置 pom.xml
在 pom.xml
中定义不同环境的配置属性:
xml
<profiles>
<!-- 开发环境 -->
<profile>
<id>dev</id>
<properties>
<spring.profile>dev</spring.profile>
<nacos.server.address>192.168.0.121:8848</nacos.server.address>
</properties>
<activation>
<!--是否默认激活,idea开发右侧的maven-install中,profiles默认选中dev-->
<activeByDefault>true</activeByDefault>
</activation>
</profile>
<!-- 测试环境 -->
<profile>
<id>test</id>
<properties>
<spring.profile>test</spring.profile>
<nacos.server.address>192.168.157.130:8848</nacos.server.address>
</properties>
<activation>
<activeByDefault>false</activeByDefault>
</activation>
</profile>
<!-- 本地环境 -->
<profile>
<id>local</id>
<properties>
<spring.profile>test</spring.profile>
<nacos.server.address>127.0.0.1:8848</nacos.server.address>
</properties>
<activation>
<activeByDefault>false</activeByDefault>
</activation>
</profile>
<!-- 生产环境 -->
<profile>
<id>prod</id>
<properties>
<spring.profile>prod</spring.profile>
<nacos.server.address>47.96.94.207:8848</nacos.server.address>
</properties>
<activation>
<activeByDefault>false</activeByDefault>
</activation>
</profile>
</profiles>
<build>
<!-- Maven 资源配置 -->
<resources>
<!--
目的(作用):关闭过滤 src/main/resources 路径下的所有文件,确保部分资源文件在构建过程中不被 Maven 过滤器处理。
注意:适用于二进制文件、图像文件等不需要替换变量的资源文件,比如图标文件、静态 HTML 文件等。
-->
<resource>
<directory>src/main/resources</directory>
<!-- 关闭过滤 -->
<filtering>false</filtering>
</resource>
<!--
目的(作用):启用过滤 src/main/resources 路径下以指定前缀命名的文件,确保只有特定文件在构建过程中被 Maven 过滤器处理。
注意:适用于文本文件,如配置文件,其中包含需要在构建时替换的变量(例如:将 ${server.port} 替换为具体的值)。
-->
<resource>
<directory>src/main/resources</directory>
<!-- 引入所有 匹配文件进行过滤 -->
<includes>
<include>application*</include>
<include>bootstrap*</include>
<include>banner*</include>
</includes>
<!-- 启用过滤 即该资源中的变量将会被过滤器中的值替换 -->
<filtering>true</filtering>
</resource>
</resources>
</build>
2. 修改配置文件
在 application.yml
或 bootstrap.yml
文件中使用占位符动态替换环境变量:
yml
# Tomcat
server:
port: 9201
# Spring
spring:
application:
# 应用名称
name: mall-system
profiles:
# 环境配置
active: @spring.profile@
cloud:
nacos:
discovery:
# 服务注册地址
server-addr: @nacos.server.address@
config:
# 配置中心地址
server-addr: @nacos.server.address@
# 配置文件格式
file-extension: yml
# 共享配置
shared-configs:
- application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
说明:
@spring.profile@
和@nacos.server.address@
将在打包过程中被替换为pom.xml
中的配置值。spring.cloud.nacos.config.shared-configs
支持动态加载不同环境的配置文件。
3. 打包与测试
使用以下命令进行打包:
bash
mvn clean package -P dev # 开发环境
mvn clean package -P test # 测试环境
mvn clean package -P prod # 生产环境
打包细节说明
- 占位符替换 : 在打包过程中,Maven 会根据激活的 Profile 自动将配置文件中的占位符替换为对应的值。
- 示例:如果激活的是
test
环境:@spring.profile@
被替换为test
。@nacos.server.address@
被替换为192.168.157.130:8848
。
- 示例:如果激活的是
- 激活方式 :
- 默认激活:
<activeByDefault>true</activeByDefault>
确保在未指定 Profile 时使用默认配置。 - 手动激活:使用
-P
参数指定 Profile,例如-P prod
。
- 默认激活:
- 替换规则 : Maven 会将
<properties>
中定义的变量值应用于资源文件中启用了过滤的部分(如application.yml
)。
验证
- 打包后检查目标文件: 查看生成的
target
文件夹,确保配置文件中的占位符已正确替换。 - 启动应用: 使用不同环境的包运行应用,确保环境配置符合预期。
注意事项
- Profile 命名规范 : 确保
<id>
和application-{profile}.yml
中的{profile}
一致。 - 环境隔离: 不同环境的配置应独立管理,避免交叉影响。
- 默认配置文件: 确保未激活任何 Profile 时,应用能够使用默认配置文件正常运行。
总结
通过以上配置,Spring Boot 项目可以实现环境的无缝切换,提升了开发和部署的效率,同时降低了配置出错的风险。
在打包过程中,Maven会根据指定的Profile将配置文件中的占位符(如 @nacos.server.address@
)替换为对应Profile中定义的属性值。例如,使用 test
Profile打包时,@nacos.server.address@
将被替换为 192.168.157.130:8848
.