概述
按照项目开发的流程,项目工程需要经历开发人员本地测试环境(dev),进入测试阶段后有测试环境(test),测试无误后需要将程序发布到生产环境(production)下,而对于这三个不同的项目环境,应用程序要在该环境下运行,必须有不同的配置项,如开发和生产环境使用不同的数据库地址,不同的线程池参数,因此需要对不同的项目环境进行不同的配置,为了简化和规范这些参数配置,需要对其进行统一规范管理。
三个环境变量的配置文件分别为
application-dev.properties : 开发环境配置文件
application-test.properties : 测试环境配置文件
application-prod.properties : 正式环境配置文件
各个环境需要读取相应的配置文件。
一、在 application.properties 文件中添加属性
# 通过读取运行环境变量,当使用 mvn -P dev 打包时,profileActive=dev这个属性生效,将替换配置文件中的 @profileActive@ 属性为dev
spring.profiles.active=@profileActive@
二、先在pom.xml 配置运行的各个环境数据信息
<!-- 配置运行环境 -->
<profiles>
<!-- 开发环境 -->
<profile>
<id>dev</id>
<properties>
<!-- 通过读取运行环境变量,当使用 mvn -P dev 打包时,profileActive=dev这个属性生效,将替换配置文件中的 @profileActive@ 属性为dev-->
<profileActive>dev</profileActive>
</properties>
<activation>
<!-- 默认启用开发环境 -->
<activeByDefault>true</activeByDefault>
</activation>
</profile>
<!-- 演示环境 -->
<profile>
<id>test</id>
<properties>
<profileActive>test</profileActive>
</properties>
</profile>
<!-- 正式环境 -->
<profile>
<id>prod</id>
<properties>
<profileActive>prod</profileActive>
</properties>
</profile>
</profiles>
在POM.xml中配置3个profile,对应项目所处的3个不同的环境-dev, test, production, profile的id属性即为每个环境赋予一个唯一的标示,<properties>元素的内容则是以key-value的形式出现的键值对,如我们定义了一个变量<env>,其值在不同的环境下(不同id)被赋予了不同的值(dev, production, test),要激活不同的环境打包,我们可以在命令行通过mvn package –P ${profileId}来让其运行,为了开发便利,默认激活的是dev开发环境,即开发人员不需要通过命令行手动输入-p参数也能运行dev环境的打包。
三、定义filter(由filter插件完成此操作)
可以使用Maven来对项目资源进行变量替换。在资源过滤被激活的时候,Maven会扫描资源,寻找由${}包围的Maven属性的引用。
一旦它找到这些引用,它就会使用合适的值去替换它们,当需要根据目标部署平台使用不同的配置来参数化一个构建的时候,这就非常有用。
通常一个在src/main/resources目录下的.properties文件或者XML文档会包含对外部资源的引用,如需要根据目标部署平台进行不同配置的数据库或网络地址。
例如,一个从数据库读取数据的系统有一个XML文档,其包含了数据库的JDBC URL以及安全凭证。如果你在开发和产品环境使用不同的数据库,使用Maven Profile来为不同的部署环境定义不同的配置。
Filter的配置(在<build>元素下添加节点)如下:
配置需要被替换的资源文件地址
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
<build>
<resources>
<resource>
<!-- 指定打包时,需要处理的文件 -->
<directory>src/main/resources</directory>
<!-- 处理文件时需要对文件变量进行替换 -->
<filtering>true</filtering>
<!-- 指定打包时,不需要包含以下文件 -->
<excludes>
<exclude>application-dev.properties</exclude>
<exclude>application-test.properties</exclude>
<exclude>application-prod.properties</exclude>
</excludes>
</resource>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
<!-- 指定打包时包含以下文件, ${profileActive}会根据指定的profile进行替换-->
<includes>
<include>application-${profileActive}.properties</include>
<include>application.properties</include>
</includes>
</resource>
</resources>
</build>