Spring Boot 多环境配置与切换
当在多配置文件中,需要切换配置文件时,通常的做法都是修改激活的文件名称,而spring.profiles.active=@profiles.active@
是配合maven profile
进行选择不同配置文件进行启动,可以避免修改文件,而在maven
打包是指定使用哪个配置文件。
1. 配置 pom.xml
在 pom.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
文件中使用占位符动态替换环境变量:
# Tomcat
server:port: 9201# Spring
spring: application:# 应用名称name: mall-systemprofiles:# 环境配置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. 打包与测试
使用以下命令进行打包:
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
.