Maven使用Profile

在开发项目时,设想有以下场景:
你的Maven项目存放在一个远程代码库中(比如github),该项目需要访问数据库,你有两台电脑,一台是Linux,一台是Mac OS X,你希望在两台电脑上都能做项目开发。但是,安装Linux的电脑上安装的是MySQL数据库,而Mac OS X的电脑安装的是PostgreSQL数据库。此时你需要找到一种简单的方法在两种数据库连接中进行切换,你会怎么做?
此外,你的项目需要部署。为了调试,在开发时我们在Java编译结果中加入了调试信息(Java默认)。而在部署时你希望Java编译结果中不出现调试信息。此时你又会怎么做?

答案是Profile。Maven的Profile用于在不同的环境下应用不同的配置。一套配置即称为一个Profile。这里的“环境”可以是操作系统版本,JDK版本或某些文件是否存在这样的物理环境,也可以是你自己定义的一套逻辑环境。比如上面的A中所说的Linux和Mac OS X便是一种物理环境,而B中讲的开发环境和部署环境则为逻辑环境。Maven提供了Activation机制来激活某个Profile,它既允许自动激活(即在某些条件满足时自动使某个Profile生效),也可以手动激活。

一个Profile几乎可以包含所有能够出现在pom.xml中的配置项,比如<artifactId>,<outputDirectory>等。相当于在Profile中定义的配置信息会覆盖原有pom.xml中的相应配置项。

(一)定义Profile
一般来说,我们将Profile的定义放在pom.xml文件的最后:

<profiles>
	<profile>
		<id>apple</id>
		<activation>
			<activeByDefault>true</activeByDefault>
		</activation>
		<properties>
			<fruit>APPLE</fruit>
		</properties>
	</profile>
	<profile>
		<id>banana</id>
		<properties>
			<fruit>BANANA</fruit>
		</properties>
	</profile>
</profiles>

在上面的配置中,我们定义了两个Profile,一个id为apple,该Profile将fruit属性设置为APPLE,另一个id为banana,它将fruit属性设置为BANANA。此外,第一个Profile还配置了“<activeByDefault>true</activeByDefault>”,表明该Profile默认即是生效的。

为了打印出fruit这个属性,我们再向pom.xml中添加一个maven-antrun-plugin插件,我们可以通过该插件的echo任务来打印属性信息。我们将该打印配置在Maven的initialize阶段(任何阶段都可以):

<plugin>
	<artifactId>maven-antrun-plugin</artifactId>
	<executions>
		<execution>
			<phase>initialize</phase>
			<goals>
				<goal>run</goal>
			</goals>
			<configuration>
				<tasks>
					<echo>Fruit:${fruit}</echo>
				</tasks>
			</configuration>
		</execution>
	</executions>
</plugin>

配置完成之后,执行:“mvn initialize”,由于id为apple的Profile默认生效,此时将在终端输出“APPLE”字样:
......
[INFO] Executing tasks
[echo] Fruit:APPLE
[INFO] Executed tasks
......

如果要使用id为banana的Profile,我们可以显式地指定使用该Profile:"mvn initialize -Pbanana":

......
[INFO] Executing tasks
[echo] Fruit:BANANA
[INFO] Executed tasks
......

(二)手动激活Profile
事实上,在上面的例子中,我们在显示“BANANA”时便使用了手动激活Profile的方式。手动激活Profile要求我们在运行mvn命令时通过“-PprofileId”的方式指定使用某个Profile。

(三)自动激活Profile
在自动激活Profile中,我们需要为某个Profile预先定义一些前提条件(比如操作系统版本),当这些前提条件满足时,该Profile将被自动激活。我们可以为Mac OS X和Linux(Unix)分别定义一套数据库连接:

<profile>
	<id>mac</id>
	<activation>
		<activeByDefault>false</activeByDefault>
		<os>
			<family>mac</family>
		</os>
	</activation>
	<properties>
		<database.driverClassName>org.postgresql.Driver</database.driverClassName>
		<database.url>jdbc:postgresql://localhost/database</database.url>
		<database.user>username</database.user>
		<database.password>password</database.password>
	</properties>
</profile>

<profile>
	<id>unix</id>
	<activation>
		<activeByDefault>false</activeByDefault>
		<os>
			<family>unix</family>
		</os>
	</activation>
	<properties>
		<database.driverClassName>com.mysql.jdbc.Driver</database.driverClassName>
		<database.url>jdbc:mysql://localhost:3306/database</database.url>
		<database.user>username</database.user>
		<database.password>password</database.password>
	</properties>
</profile>

请注意,以上两个Profile在默认情况下都没有被激活,Maven在运行时会检查操作系统,如果操作系统为Mac OS X,那么Maven将自动激活id为mac的Profile,此时将使用PostgreSQL的数据库链接,如果操作系统为Linux或Unix,那么将使用MySQL数据库连接。更多的Profile自动激活条件,请参考此文档。

发表评论

电子邮件地址不会被公开。

*