首页 » Maven实战 » Maven实战全文在线阅读

《Maven实战》14.3 资源过滤

关灯直达底部

为了应对环境的变化,首先需要使用Maven属性将这些将会发生变化的部分提取出来。在上一节的数据库配置中,连接数据库使用的驱动类、URL、用户名和密码都可能发生变化,因此用Maven属性取代它们:

这里定义了4个Maven属性:db.driver、db.url、db.username和db.password,它们的命名是任意的,读者可以根据自己的实际情况定义最合适的属性名称。

既然使用了Maven属性,就应该在某个地方定义它们。14.1节介绍过如何自定义Maven属性,这里要做的是使用一个额外的profile将其包裹,如代码清单14-4所示。

代码清单14-4 针对开发环境的数据库配置

代码清单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 为主资源目录开启过滤

类似地,代码清单14-6中的配置为测试资源目录开启了过滤。

代码清单14-6 为测试资源目录开启过滤

读者可能还会从上述代码中意识到,主资源目录和测试资源目录都可以超过一个,虽然会破坏Maven的约定,但Maven允许用户声明多个资源目录,并且为每个资源目录提供不同的过滤配置,如代码清单14-7所示。

代码清单14-7 配置多个资源目录

代码清单14-7配置了两个资源目录,其中src/main/resources开启了过滤,而src/main/sql没有启用过滤。

到目前为止一切基本就绪了,我们将数据库配置的变化部分提取成了Maven属性,在POM的profile中定义了这些属性的值,并且为资源目录开启了属性过滤。最后,只需要在命令行激活profile,Maven就能够在构建项目的时候使用profile中属性值替换数据库配置文件中的属性引用。运行命令如下:

mvn的-P参数表示在命令行激活一个profile。这里激活了id为dev的profile。构建完成后,输出目录中的数据库配置就是开发环境的配置了: