Spring Profiles 实现多环境配置
Spring Profiles 就是针对应用程序,不同环境需要不同配置加载的一种解决方案。
使用场景:
我们平常项目开发,经常需要根据不同的环境进行配置的修改,比如在本地开发会加载本机的配置和开发环境数据库,在测试服务器上部署时就需要加载测试环境配置和数据库,同样地,当项目发布生产环境时就需要设置为生产环境配置和数据库。这样一来,不同的环境部署都需要额外的处理来调整环境的配置,维护起来十分繁琐,还容易出错。
创建配置文件
我需要使用Spring Profiles帮我们做到
1、dev环境使用dev的结尾配置和公共配置
2、prod环境使用prod的结尾配置和公共配置
1、pom文件配置
与properties同级
<profiles>
<!-- 开发环境 -->
<profile>
<id>dev</id>
<activation>
<!--设置默认为dev环境-->
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<environment>dev</environment>
</properties>
</profile>
<!-- 生产环境 -->
<profile>
<id>prod</id>
<properties>
<environment>prod</environment>
</properties>
</profile>
</profiles>
插件,作用是用来识别配置文件中的@,后面会用到
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>3.1.0</version>
<configuration>
<delimiters>
<delimiter>@</delimiter>
</delimiters>
<useDefaultDelimiters>false</useDefaultDelimiters>
</configuration>
</plugin>
与plugins同级
<resources>
<!--排除配置文件-->
<resource>
<directory>src/main/resources</directory>
<!--先排除所有的配置文件-->
<excludes>
<!--使用通配符,当然可以定义多个exclude标签进行排除-->
<exclude>application*.yaml</exclude>
<exclude>application*.properties</exclude>
</excludes>
</resource>
<resource>
<directory>src/main/resources</directory>
<!--引入所需环境的配置文件-->
<filtering>true</filtering>
<includes>
<include>application.yaml</include>
<include>application.properties</include>
<!--根据maven选择环境导入配置文件-->
<include>application-${environment}.yaml</include>
<include>application-${environment}.properties</include>
</includes>
</resource>
</resources>
2、配置文件
这里@符里面的environment是占位符,表示pom中<environment>dev</environment>
spring:
profiles:
active: '@environment@'
切换环境
因为配置文件中使用了'@environment@'
,使用maven来切换
由于配置了dev和prod环境,所以maven会显示出两个profile
使用dev环境
1、勾选dev
2、刷新maven,不刷新的话,应用启动会失败
不刷新maven会出现下面的情况,启动不一会会自己停止。
启动应用
dev环境已激活
打包之后的target也没问题
使用prod环境
1、勾选prod
2、刷新
启动应用
prod环境已激活
打包之后的配置文件也ok
在SpringCloud环境怎么配置呢
父项目pom.xml
<profiles>
<profile>
<id>dev</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<environment>dev</environment>
</properties>
</profile>
<profile>
<id>prod</id>
<properties>
<environment>prod</environment>
</properties>
</profile>
</profiles>
<resources>
<!--排除配置文件-->
<resource>
<directory>src/main/resources</directory>
<!--先排除所有的配置文件-->
<excludes>
<!--使用通配符,当然可以定义多个exclude标签进行排除-->
<exclude>application*.yml</exclude>
<exclude>application*.yaml</exclude>
<exclude>application*.properties</exclude>
</excludes>
</resource>
<resource>
<directory>src/main/resources</directory>
<!--引入所需环境的配置文件-->
<filtering>true</filtering>
<includes>
<include>application.yml</include>
<include>application.yaml</include>
<include>application.properties</include>
<!--根据maven选择环境导入配置文件-->
<include>application-${environment}.yml</include>
<include>application-${environment}.yaml</include>
<include>application-${environment}.properties</include>
</includes>
</resource>
</resources>
子项目pom
<profiles>
<profile>
<id>dev</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<environment>dev</environment>
</properties>
</profile>
<profile>
<id>prod</id>
<properties>
<environment>prod</environment>
</properties>
</profile>
</profiles>