Profile可以用来鼓励构建可移植性。如果你的构建需要为不同的平台做一些细微的自定义,或者如果你针对不同的目标平台生成不同的输出,项目profile就能增加构建可移植性。Settings profile通常会降低构建可移植性,因为它会添加一些必须在开发人员之间沟通的额外项目信息。下面的小节提供了一些如何在你项目中使用Maven profile的指导意见和想法。
创建Maven项目profile的最核心动机之一就是为了提供环境特定的配置。在开发环境中,你可能想要生成带有调试信息的字节码,配置你的系统使用开发数据库实例。而在产品环境中,你可能会想要生成一个已签名的JAR,并且配置系统使用产品数据库。本章,我们使用dev
和prod
等标识符定义了很多环境。一种更简单的方式是,定义一些会被环境属性自动激活的profile,在你所有的项目中使用这些通用的环境属性。例如,如果每个项目都有一个development
profile,当属性environment.type
的值为dev
时被激活,并且同样的项目还有production
profile,当属性environment.type
的值为prod
时被激活。那么,你就可以在你的settings.xml
中创建一个默认的profile,在你的开发机器上,总是将environment.type
设置为dev
。这样,所有定义了dev
profile的项目都会由同样的系统变量激活。让我们看看如何完成这件事情,以下的
定义了一个profile,将~/.m2/settings.xml
environment.type
属性设置成了dev
。
Example 11.9. ~/.m2/settings.xml 中定义一个设置了environment.type的默认profile,
<settings> <profiles> <profile> <activation> <activeByDefault>true</activeByDefault> </activation> <properties> <environment.type>dev</environment.type> </properties> </profile> </profiles> </settings>
这意味着每次你在你机器上运行Maven的时候,该profile总会被激活,属性environment.type
的值被设置为dev
。之后你就可以使用这个属性来激活定义在某个如下项目pom.xml
中的profile。让我们看一下如何在项目的pom.xml
定义一个当属性environment.type
的值为dev
时被激活的profile。
Example 11.10. 项目profile,当environment.type等于'dev'时被激活
<project> ... <profiles> <profile> <id>development</id> <activation> <property> <name>environment.type</name> <value>dev</value> </property> </activation> <properties> <database.driverClassName>com.mysql.jdbc.Driver</database.driverClassName> <database.url> jdbc:mysql://localhost:3306/app_dev </database.url> <database.user>development_user</database.user> <database.password>development_password</database.password> </properties> </profile> <profile> <id>production</id> <activation> <property> <name>environment.type</name> <value>prod</value> </property> </activation> <properties> <database.driverClassName>com.mysql.jdbc.Driver</database.driverClassName> <database.url>jdbc:mysql://master01:3306,slave01:3306/app_prod</database.url> <database.user>prod_user</database.user> </properties> </profile> </profiles> </project>
该项目定义了一些属性如database.url
和database.user
,它们可能被用来配置一些定义在pom.xml
中的Maven插件。有很多可用的插件可以用来操作数据库,运行SQL,而且还有如Maven
Hibernate3之类的插件可以帮你在使用持久化框架的时候生成注解模型对象。这其中的一些插件,可以在pom.xml
中被配置成使用这些属性。这些属性还可以被用来过滤资源。本例中,因为我们在~/.m2/settings.xml
中定义了一个profile,设置environment.type
为dev
,在这台开发机器上运行Maven的时候,development
profile就一直会被激活。做为选择,如果我们想要覆盖缺省值,我们可以在命令行设置这个属性值。如果我们需要激活production
profile,我们可以如下运行Maven:
~/examples/profiles $ mvn install -Denvironment.type=prod
在命令行设置一个属性可以覆盖定义在~/.m2/settings.xml
中的缺省值。我们可以仅仅定义一个id
为"dev"的profile,然后直接使用-P命令行参数调用它,但是使用environment.type
属性允许我们在编写其它项目的pom.xml
时遵循这个标准。在你代码库中的每个项目都可以有一个profile,由定义在每个用户~/.m2/settings.xml
中的项目的environment.type
属性激活。这样,开发人员就能共享开发配置,而不用在不可移植的settings.xml
文件中定义这些配置。