1. 在开发中会遇到要把项目部署到不同的环境,一般把项目部署到服务器上,需要改数据库配置,redis配置等等,这个时候如果只有一套配置文件,那部署前要把配置文件里的路径,ip都要改一遍,这样人工的修改难免会出现漏改,错改的情况,再遇到集群部署,分布式部署,一错再改就不好改了,所以自然想到如果可以有2套不同环境的配置文件就好了。
SpringBoot提供了和简单的方法:spring.profiles.active=dev,然后再创建application-dev.properties。
即项目同时可以有多个文件,然后由spring.profiles.active来控制哪一个生效:
application.properties
application-dev.properties
application-pro.properties
application-test.properties
注意:application.properties与spring.profiles.active所指向的配置文件的关系是这样的,如果两者都配置了相同的属性,则会被spring.profiles.active指向的配置文件覆盖(此配置会生效)。如果两者中只有一者配置了某个属性,则以那个配置了的为准。举个例子,application.properties配置了server.port=8081,application-dev.properties没有配置,则server.port=8081。
2. 当开发一个多个模块分开,分布式的程序的时候的就很麻烦,部署的时候就需要一个模块一个模块改配置文件里的spring.profiles.active的值,这显然很麻烦。
当开发分布式部署的程序试,一般有一个总的项目pom文件,然后在这个pom文件里定义配置信息,然后通过动态的激活某一个配置来实现统一改所有的配置文件。
<profiles> <profile> <id>dev</id> <properties> <activeProfile>dev</activeProfile> </properties> </profile> <profile> <id>pro</id> <properties> <activeProfile>pro</activeProfile> </properties> </profile> <profile> <id>test</id> <properties> <activeProfile>test</activeProfile> </properties> <activation> <activeByDefault>true</activeByDefault> </activation> </profile> </profiles>
如上,定一个3个配置信息,通过设置activeByDefault来激活其中的配置,然后通过maven-resources-plugin插件和resource的filtering属性用来表示资源文件中的占位符是否需要被替换来实现配置文件的替换。
现在application-pro.properties这个文件需要改一下:
spring.profiles.active=${activeProfile}
然后在各个模块的pom文件里加上:
<resources> <resource> <directory>src/main/resources</directory> <excludes> <exclude>application.yml</exclude> <exclude>application-dev.yml</exclude> <exclude>application-pro.yml</exclude> <exclude>application-test.yml</exclude> </excludes> </resource> <resource> <directory>src/main/resources</directory> <filtering>true</filtering> <includes> <include>application.yml</include> <include>application-${activeProfile}.yml</include> </includes> </resource> </resources>
上面是防止打包的时候,打包其他的环境的配置文件。