14.3 资源过滤
为了应对环境的变化,首先需要使用Maven属性将这些将会发生变化的部分提取出来。在上一节的数据库配置中,连接数据库使用的驱动类、URL、用户名和密码都可能发生变化,因此用Maven属性取代它们:
database.jdbc.driverClass=${db.driver}
database.jdbc.connectionURL=${db.url}
database.jdbc.username=${db.username}
database.jdbc.password=${db.password}
这里定义了4个Maven属性:db.driver、db.url、db.username和db.password,它们的命名是任意的,读者可以根据自己的实际情况定义最合适的属性名称。
既然使用了Maven属性,就应该在某个地方定义它们。14.1节介绍过如何自定义Maven属性,这里要做的是使用一个额外的profile将其包裹,如代码清单14-4所示。
代码清单14-4 针对开发环境的数据库配置
<profiles>
<profile>
<id>dev</id>
<properties>
<db.driver>com.mysql.jdbc.Driver</db.driver>
<db.url>jdbc:mysql://192.168.1.100:3306/test</db.url>
<db.username>dev</db.username>
<db.password>dev-pwd</db.password>
</properties>
</profile>
</profiles>
代码清单14-4中的Maven属性定义与直接在POM的properties元素下定义并无二致,这里只是使用了一个id为dev的profile,其目的是将开发环境下的配置与其他环境区别开来。关于profile,本章将详细解释。
有了属性定义,配置文件中也使用了这些属性,一切OK了吗?还不行。读者要留意的是,Maven属性默认只有在POM中才会被解析。也就是说,${db.username}放到POM中会变成test,但是如果放到src/main/resources/目录下的文件中,构建的时候它将仍然还是${db.username}。因此,需要让Maven解析资源文件中的Maven属性。
资源文件的处理其实是maven-resources-plugin做的事情,它默认的行为只是将项目主资源文件复制到主代码编译输出目录中,将测试资源文件复制到测试代码编译输出目录中。不过只要通过一些简单的POM配置,该插件就能够解析资源文件中的Maven属性,即开启资源过滤。
Maven默认的主资源目录和测试资源目录的定义是在超级POM中(可以回顾8.5节)。要为资源目录开启过滤,只要在此基础上添加一行filtering配置即可,如代码清单14-5所示。
代码清单14-5 为主资源目录开启过滤
<resources>
<resource>
<directory>${project.basedir}/src/main/resources</directory>
<filtering>true</filtering>
</resource>
<resources>
类似地,代码清单14-6中的配置为测试资源目录开启了过滤。
代码清单14-6 为测试资源目录开启过滤
<testResources>
<testResource>
<directory>${project.basedir}/src/test/resources</directory>
<filtering>true</filtering>
</testResource>
</testResources>
读者可能还会从上述代码中意识到,主资源目录和测试资源目录都可以超过一个,虽然会破坏Maven的约定,但Maven允许用户声明多个资源目录,并且为每个资源目录提供不同的过滤配置,如代码清单14-7所示。
代码清单14-7 配置多个资源目录
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
<resource>
<directory>src/main/sql</directory>
<filtering>false</filtering>
</resource>
<resources>
代码清单14-7配置了两个资源目录,其中src/main/resources开启了过滤,而src/main/sql没有启用过滤。
到目前为止一切基本就绪了,我们将数据库配置的变化部分提取成了Maven属性,在POM的profile中定义了这些属性的值,并且为资源目录开启了属性过滤。最后,只需要在命令行激活profile,Maven就能够在构建项目的时候使用profile中属性值替换数据库配置文件中的属性引用。运行命令如下:
$mvn clean install-Pdev
mvn的-P参数表示在命令行激活一个profile。这里激活了id为dev的profile。构建完成后,输出目录中的数据库配置就是开发环境的配置了:
database.jdbc.driverClass=com.mysql.jdbc.Driver
database.jdbc.connectionURL=jdbc:mysql://localhost:3306/test
database.jdbc.username=dev
database.jdbc.password=dev-pwd