Maven-资源过滤

在不同的环境中,项目的源码应该使用不同的方式进行构建,最常见的就是数据库配置了。

例如,在开发环境中,有些项目会在src/main/resources/目录下放置带有如下内容的数据库配置文件:

database.jdbc.driverClass = com.mysql.jdbc.Driver

database.jdbc.connectionURL = jdbc:mysql://localhost:3306/test

database.jdbc.username = dev

database.jsbc.password = dev-pwd

但是当测试人员想要构建项目产品并进行测试的时候,他们往往需要使用不同的数据库。可能测试环境的数据库配置如下:

database.jdbc.driverClass = com.mysql.jdbc.Driver

database.jdbc.connectionURL = jdbc:mysql://192.168.1.111:3306/test

database.jdbc.username = test

database.jsbc.password = test-pwd

连接数据库的URL、用户名和密码都发生了变化,类似的,当项目被发布到生产环境,使用的数据库配置又是另外一套了。这时比较原始的做法是,使用与开发环境一样的构件,然后在测试或者发布产品之前再手动改一下这些配置。这时可行的,也是比较常见的,但肯定不是最好的方法。手动往往就意味着低效和错误。

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

database.jdbc.driverClass = ${db.driver}

database.jdbc.connectionURL = ${db.url}

database.jdbc.username = ${db.username}

database.jsbc.password = ${db.password}

pom.xml中使用一个额外的profile将上述属性进行包裹:

Maven属性默认只有在POM中才会被解析,也就是说,${db.username}放到pom中会变成dev,但是如果放到src/main/resources/目录下的文件中,构建的时候它将仍然还是${db.username}。因此,需要让Maven解析资源文件中的Maven属性。

资源文件的处理其实是maven-resources-plugin做的事情,它默认的行为只是将项目主资源文件复制到主代码编译输出目录中,将测试资源文件复制到测试代码编译输出目录中。不过只要通过一些简单的配置,该插件就能解析资源文件中的Maven属性,即开启资源过滤。

Maven默认的主资源目录和测试资源目录的定义是在超级POM中,要为资源目录开启过滤,只要在此基础上添加一行filtering配置即可。

为主资源目录开启过滤:

为测试资源目录开启过滤:

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

$ mvn clean install -Pdev

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

出自《Maven实战》-许晓斌

猜你喜欢

转载自blog.csdn.net/tjsahwj/article/details/84748308