上一篇文章中,简单的介绍了通过工具类在项目全局读取属性文件的实现方法。其实我们在开发一个项目时,经常会遇到开发、测试、生产等多个运行环境。在这些不同的环境中,项目中使用到的常量、属性值也不尽相同。如果在每次编译打包前手动个性这些值,势必会带来不少麻烦及失误。如果能够在打包时通过不同的命令让系统自动加载不同环境的属性值,就方便得多了。Mave就可以帮我们实现这样的功能。下面我们就基于上一篇文章搭建的小项目上实现这个功能。
一、在pom.xml文件中增加以下内容:
<build>
<finalName>filter</finalName>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering> <!-- 是否使用过滤器 -->
</resource>
</resources>
<filters>
<filter>src/main/filters/config-${name}.filter</filter>
</filters>
</build>
- directory标签说明了需要被替换的属性文件路径, db.properties 应该在 src/main/resource 目录下
- filters标签列出了需要使用的用来替换的属性文件,其实它们也是普通的properties文件。为了方便管理,我们将这些文件单独存放。
- filter标签中的文件中里的${name}“变量”代指三个文件名的第二个单词:dev、test、product,分别表示开发、测试、生产环境中用到的不同属性值。
二、我们以一个简单的属性值“test.a”为例,三个文件的内容分别如下:
test.a=a dev var
test.a=a test var
test.a=a product var
而在我们的属性文件 jdbc.properties 中,也定义了这个属性,只不过它是这样的:
test.a=${test.a}
这几个filter文件中存放的就是要对 ${test.a} 进行替换的内容。
三、想要这些filter文件里的替换值能在打包时生效,我们还需要maven帮忙。在 pom.xml 文件中添加以下内容:
<profiles>
<profile>
<id>dev</id>
<activation><activeByDefault>true</activeByDefault></activation>
<properties>
<name>dev</name>
</properties>
</profile>
<profile>
<id>test</id>
<properties>
<name>test</name>
</properties>
</profile>
<profile>
<id>product</id>
<properties>
<name>product</name>
</properties>
</profile>
</profiles>
我们定义了三个profile,name属性就是与“${name}”对应关联的。activeByDefault标签定义了dev为默认的filter文件。id分别是dev、test、product,id值也是我们用mavne打包时根据不同环境需要传递的参数。
四、测试使用
1、由于dev是默认的filter文件,因此我们正常启动项目,从属性文件中取得的 test.a 值为“a dev var”。
2、我们使用maven命令对项目进行打包,比如在测试环境中,打包命令为package -Ptest,war包中的 db.properties 文件中的test.a=a test var;那么在生产环境中,打包命令使用package -Pproduct,则test.a=a product var。不信你把war包解压打开看一看。