最大限度利用Maven settings.xml文件
John Ferguson在他的最新Blog中,介绍了使用Maven settings.xml文件的一些鲜为人知的技巧,希望对大家也有所助益。(2009.08.14最后更新)
如果你在任何程度中使用过Maven,你应该知道settings.xml文件。settings.xml文件包含有与系统环境相关的配置细节,例如代理配置,仓库,服务器的用户名和密码,等等。
下面是一个典型的settings.xml文件的示例:
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0
http://maven.apache.org/xsd/settings-1.0.0.xsd">
<localRepository>C:/maven/repository</localRepository>
<proxies>
<proxy>
<id>localproxy</id>
<active>true</active>
<protocol>http</protocol>
<host>proxy.acme.com</host>
<port>8080</port>
<username>scott</username>
<password>t0ps3cr3t</password>
<nonProxyHosts>*.acme.com</nonProxyHosts>
</proxy>
</proxies>
<servers>
<server>
<id>dbserver</id>
<username>scott</username>
<password>tiger</password>
</server>
</servers>
</settings>
例如,若你使用公司的环境,在该环境中,你的Maven主目录是每天早晨当你登录时由网络传输的,localRepository元素就会非常有用。在这种情况 下,将本地仓库置于你本地磁盘的不同目录中,将会节约大量的带宽。
你也可以在settings.xml文件中定义仓库,镜像,概述和属性。在此处,我不想涉及上述内容,因为在其它地方已经有关于它们的很好的文档了。
很少为人所知,或至少是很少被使用的功能是,在你的pom.xml文件中使用定义在settings.xml文件中的数据。
事实上,你能使用settings.xml中的任一元素,然而其中的一些则更为有用。
一个普遍且方便的例子就是使用localRepository变量。你可能需要将该变量置于一个脚本中,或使用它来引用仓库中的某个特定的JAR文件(尽管通常有更优雅的方案来解决这一问题)。你可以通过简单地引用${settings.localRepository}来使用localRepository属性。例如,在下面的代码中,我们调用一个Ant脚本,并通过名为"localRepository"的属性传给它一个本地仓库路径:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<executions>
<execution>
<id>generate-stuff</id>
<phase>pre-comile</phase>
<goals>
<goal>run</goal>
</goals>
<configuration>
<tasks>
<ant target="generate">
<property name="localRepository" value="${settings.localRepository}"/>
</ant>
</tasks>
</configuration>
</execution>
</executions>
</plugin>
做更多有趣的事情,特别是当你也在构建中集成了Groovy时。例如,假设在集成测试阶段期间,我们需要确保特定的SQL脚本已在数据库中执行过了。我们有一个名为update-scripts.groovy的Groovy脚本来做这件事情,但它需要以命令行参数的形式提供用户名和密码。在集成测试阶段之前,你应如何使用定义在settings.xml中的用户名和密码呢?是的,只需一点儿Groovy魔术,没有比这儿更简单的了。settings对象可用于任何集成到pom.xml中的Groovy脚本,所以你可像使用一个普通对象那样方便地使用它,如下示例:
<plugin>
<groupId>org.codehaus.groovy.maven</groupId>
<artifactId>gmaven-plugin</artifactId>
<version>1.0-rc-5</version>
<executions>
<execution>
<id>process-db-scripts</id>
<phase>pre-integration-test</phase>
<goals>
<goal>execute</goal>
</goals>
<configuration>
<source>
def server = settings.servers.find{ it.id.equals('dbserver') }
"""groovy update-scripts.groovy -Ddb.username=${server.username}
-Ddb.password=${server.password}""".execute()
</source>
</configuration>
</execution>
</executions>
</plugin>
简单!事实上,一旦你既知道如何访问顶级变量,又知道如何访问settings.xml中的各个元素,那么其功效将不可限量!只需记住一定要使你的构建保持弹性--例如,不要在settings.xml文件中定义那些在pom.xml文件中无有效默认值的属性。
如果你想学习更多关于应用Maven的酷炫方法,查看最新的来自于Sonatype的在线课程。或者,为了有一个更具全景的视角,可以参加Java Power Tools bootcamp会议--很快在堪培拉,悉尼,布里斯班和惠灵顿就有研讨会了。