﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-Jiangshachina-随笔分类-Maven</title><link>http://www.blogjava.net/jiangshachina/category/16092.html</link><description>同是Java爱好者，相逢何必曾相识！&lt;br&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;a cup of Java, cheers!</description><language>zh-cn</language><lastBuildDate>Wed, 14 Dec 2011 21:04:00 GMT</lastBuildDate><pubDate>Wed, 14 Dec 2011 21:04:00 GMT</pubDate><ttl>60</ttl><item><title>最大限度利用Maven settings.xml文件(译)</title><link>http://www.blogjava.net/jiangshachina/archive/2009/08/14/291103.html</link><dc:creator>Sha Jiang</dc:creator><author>Sha Jiang</author><pubDate>Fri, 14 Aug 2009 11:13:00 GMT</pubDate><guid>http://www.blogjava.net/jiangshachina/archive/2009/08/14/291103.html</guid><wfw:comment>http://www.blogjava.net/jiangshachina/comments/291103.html</wfw:comment><comments>http://www.blogjava.net/jiangshachina/archive/2009/08/14/291103.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jiangshachina/comments/commentRss/291103.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jiangshachina/services/trackbacks/291103.html</trackback:ping><description><![CDATA[<div align="center"><span style="font-size: 10pt;"><strong><span style="font-size: 14pt;">最大限度利用Maven settings.xml文件</span></strong></span><br />
</div>
<span style="font-size: 10pt;">
<a href="http://weblogs.java.net/blog/johnsmart/">John Ferguson</a>在他的<a href="http://weblogs.java.net/blog/johnsmart/archive/2009/08/getting_the_mos.html">最新Blog</a>中，介绍了使用<a href="http://maven.apache.org/">Maven</a> <a href="http://maven.apache.org/settings.html">settings.xml</a>文件的一些鲜为人知的技巧，希望对大家也有所助益。(2009.08.14最后更新)<br />
<br />
<span style="font-size: 10pt;">
</span></span><span style="font-size: 10pt;">如果你在任何程度中使用过Maven，你应该知道settings.xml文件。<a href="http://maven.apache.org/settings.html">settings.xml</a>文件包含有与系统环境相关的配置细节，例如代理配置，仓库，服务器的用户名和密码，等等。<br />
下面是一个典型的settings.xml文件的示例：<br />
</span>
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">settings&nbsp;</span><span style="color: rgb(255, 0, 0);">xmlns</span><span style="color: rgb(0, 0, 255);">="http://maven.apache.org/SETTINGS/1.0.0"</span><span style="color: rgb(255, 0, 0);"><br />
&nbsp;&nbsp;xmlns:xsi</span><span style="color: rgb(0, 0, 255);">="http://www.w3.org/2001/XMLSchema-instance"</span><span style="color: rgb(255, 0, 0);"><br />
&nbsp;&nbsp;xsi:schemaLocation</span><span style="color: rgb(0, 0, 255);">="http://maven.apache.org/SETTINGS/1.0.0<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;http://maven.apache.org/xsd/settings-1.0.0.xsd"</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">localRepository</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">C:/maven/repository</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">localRepository</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
<br />
&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">proxies</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">proxy</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">id</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">localproxy</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">id</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">active</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">true</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">active</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">protocol</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">http</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">protocol</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">host</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">proxy.acme.com</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">host</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">port</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">8080</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">port</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">username</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">scott</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">username</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">password</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">t0ps3cr3t</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">password</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">nonProxyHosts</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">*.acme.com</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">nonProxyHosts</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">proxy</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">proxies</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;<img src="http://www.blogjava.net/Images/dot.gif" alt="" /><br />
&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">servers</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">server</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">id</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">dbserver</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">id</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">username</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">scott</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">username</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">password</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">tiger</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">password</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">server</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">servers</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;<img src="http://www.blogjava.net/Images/dot.gif" alt="" /><br />
</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">settings</span><span style="color: rgb(0, 0, 255);">&gt;</span></div>
<span style="font-size: 10pt;">例如，若你使用公司的环境，在该环境中，你的Maven主目录是每天早晨当你登录时由网络传输的，<strong>localRepository</strong>元素就会非常有用。在这种情况 下，将本地仓库置于你本地磁盘的不同目录中，将会节约大量的带宽。<br />
你也可以在settings.xml文件中定义仓库，镜像，概述和属性。在此处，我不想涉及上述内容，因为在其它地方已经有关于它们的很好的文档了。<br />
很少为人所知，或至少是很少被使用的功能是，</span>在你的pom.xml文件中使用定义在settings.xml文件中的数据。<span style="font-size: 10pt;">事实上，你能使用settings.xml中的任一元素，然而其中的一些则更为有用。<br />
一个普遍且方便的例子就是使用<strong>localRepository</strong>变量。你可能需要将该变量置于一个脚本中，或使用它来引用仓库中的某个特定的JAR文件(尽管通常有更优雅的方案来解决这一问题)。你可以通过简单地引用<strong>${settings.localRepository}</strong>来使用<strong>localRepository</strong>属性。例如，在下面的代码中，我们调用一个Ant脚本，并通过名为"localRepository"的属性传给它一个本地仓库路径：<br />
</span>
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">plugin</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">groupId</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">org.apache.maven.plugins</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">groupId</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">artifactId</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">maven-antrun-plugin</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">artifactId</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">executions</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">execution</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">id</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">generate-stuff</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">id</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">phase</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">pre-comile</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">phase</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">goals</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">goal</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">run</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">goal</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">goals</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">configuration</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">tasks</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">ant&nbsp;</span><span style="color: rgb(255, 0, 0);">target</span><span style="color: rgb(0, 0, 255);">="generate"</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">property&nbsp;</span><span style="color: rgb(255, 0, 0);">name</span><span style="color: rgb(0, 0, 255);">="localRepository"</span><span style="color: rgb(255, 0, 0);">&nbsp;&nbsp;value</span><span style="color: rgb(0, 0, 255);">="${settings.localRepository}"</span><span style="color: rgb(0, 0, 255);">/&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">ant</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">tasks</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">configuration</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">execution</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">executions</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">plugin</span><span style="color: rgb(0, 0, 255);">&gt;</span></div>
<span style="font-size: 10pt;">做更多有趣的事情，特别是当你也在构建中集成了<a href="http://groovy.codehaus.org/GMaven">Groovy</a>时。例如，假设在集成测试阶段期间，我们需要确保特定的SQL脚本已在数据库中执行过了。我们有一个名为update-scripts.groovy的Groovy脚本来做这件事情，但它需要以命令行参数的形式提供用户名和密码。在集成测试阶段之前，你应如何使用定义在settings.xml中的用户名和密码呢？是的，只需一点儿Groovy魔术，没有比这儿更简单的了。<strong>settings</strong>对象可用于任何集成到pom.xml中的Groovy脚本，所以你可像使用一个普通对象那样方便地使用它，如下示例：<br />
</span>
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; background-color: rgb(238, 238, 238); font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">plugin</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">groupId</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">org.codehaus.groovy.maven</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">groupId</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">artifactId</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">gmaven-plugin</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">artifactId</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">version</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">1.0-rc-5</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">version</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">executions</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">execution</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">id</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">process-db-scripts</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">id</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">phase</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">pre-integration-test</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">phase</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">goals</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">goal</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">execute</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">goal</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">goals</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">configuration</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">source</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;def&nbsp;server&nbsp;=&nbsp;settings.servers.find{&nbsp;it.id.equals('dbserver')&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;"""groovy&nbsp;update-scripts.groovy&nbsp;-Ddb.username=${server.username}&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-Ddb.password=${server.password}""".execute()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">source</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">configuration</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">execution</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">executions</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">plugin</span><span style="color: rgb(0, 0, 255);">&gt;</span></div>
<span style="font-size: 10pt;">简单！</span><span style="font-size: 10pt;">事实上，一旦你既知道如何访问顶级变量，又知道如何访问settings.xml中的各个元素，那么其功效将不可限量！只需记住一定要使你的构建保持弹性--例如，不要在settings.xml文件中定义那些在pom.xml文件中无有效默认值的属性。<br />
如果你想学习更多关于应用Maven的酷炫方法，查看最新的<a href="http://www.sonatype.com/solutions/training">来自于Sonatype的在线课程</a>。或者，为了有一个更具全景的视角，可以参加<a href="http://www.wakaleo.com/training/java-power-tools-bootcamp">Java Power Tools bootcamp</a>会议--很快在堪培拉，悉尼，布里斯班和惠灵顿就有研讨会了。 <br />
</span><br />
<img src ="http://www.blogjava.net/jiangshachina/aggbug/291103.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jiangshachina/" target="_blank">Sha Jiang</a> 2009-08-14 19:13 <a href="http://www.blogjava.net/jiangshachina/archive/2009/08/14/291103.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Maven入门--较复杂的实例(原)</title><link>http://www.blogjava.net/jiangshachina/archive/2006/12/12/79093.html</link><dc:creator>Sha Jiang</dc:creator><author>Sha Jiang</author><pubDate>Tue, 12 Dec 2006 10:03:00 GMT</pubDate><guid>http://www.blogjava.net/jiangshachina/archive/2006/12/12/79093.html</guid><wfw:comment>http://www.blogjava.net/jiangshachina/comments/79093.html</wfw:comment><comments>http://www.blogjava.net/jiangshachina/archive/2006/12/12/79093.html#Feedback</comments><slash:comments>18</slash:comments><wfw:commentRss>http://www.blogjava.net/jiangshachina/comments/commentRss/79093.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jiangshachina/services/trackbacks/79093.html</trackback:ping><description><![CDATA[<div align="center"><font size="4"><strong><span style="font-size: 14pt;">Maven入门--较复杂的实例</span></strong> </font><br />
</div>
<font size="2"><font size="2">本文将使用一个较复杂的实例，讲述如何定制目录布局(即不使用Maven标准目录布局)，以及讲述一些关键插件的使用(配置)。为了方便其它朋友能够方便地使用该实例，后台数据库使用开源的面向对象数据库--<a href="http://www.db4o.com/">db4o</a>，该数据库无需安装，已包含在与本文配套的实例中，文末附有该实例的下载链接。(2007.01.02最后更新)<br />
<span style="font-size: 12pt; color: red;"><span style="font-size: 12pt; color: red;">注：转载时请注明原作者(jiangshachina)及出处(<a style="color: red;" href="http://www.blogjava.net/jiangshachina">http://www.blogjava.net/jiangshachina</a>)！</span></span><br />
<br />
<strong><font size="3">1 实例的构想</font></strong><br />
文章开头的摘要已经讲述了，本文仍然将以一个实例描述如何使用Maven，</font> <font size="2">该实例将使用非Maven标准的目录结构，并将呈现一些关键的Maven插件的配置与应用。</font> <font size="2">该实例是一个基于db4o的数据库Web应用。该应用本身十分简单，即从db4o数据库中查询出若干记录并将它们显现在Web页面中。<br />
</font><font size="2">&nbsp;&nbsp;&nbsp; 该实例仍然由一个普通应用工程(demo-app)与一个Web应用工程(demo-web)，以及这两个工程的父工程(demo)构成，最终的目标是将Web应用工程制作成war文件，并部署到JBoss服务器中。启动服务器后，能够在页面中看到正确的查询结果。</font> <br />
<font size="2">&nbsp;&nbsp;&nbsp; 该实例使用<font color="#008000">Eclipse3.2 + JDK1.5.0_10 + Windows2000</font>开发。当然这仅仅只是我个人的开发平台，但该实例并不受限于此平台；由于我选择使用db4o针对JDK1.5的产品包，所以该实例只能运行在JDK1.5.0或更高版本的JDK/JRE中；</font> <font size="2">该工程中的所有文件都使用<font color="#006400">UTF-8</font>编码方式。</font> <br />
<font size="2"><br />
<font size="3"><strong>2 demo工程</strong> </font><br />
demo工程是其它两个工程的父工程，它的主要职责是预定义子工程所需要依赖的jar文件(artifact)，以及针对子工程所使用的插件进行通用配置。该工程完整的POM文件如下所示：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><font size="-0"><font size="-0"><font size="-0"><font size="2"><font size="2"><font size="2"><span style="color: #000000;">&lt;project</span><span style="color: #000000;">&gt;<br />
</span></font></font></font></font></font></font><span style="color: #000000;">&nbsp;&nbsp;&nbsp; &lt;modelVersion&gt;</span><span style="color: #000000;">4.0.0</span><span style="color: #000000;">&lt;/modelVersion&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;groupId&gt;mvn.demo&lt;/groupId&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;artifactId&gt;demo&lt;/artifactId&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;packaging&gt;pom&lt;/packaging&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;version&gt;</span><span style="color: #000000;">1.0</span><span style="color: #000000;">-SNAPSHOT&lt;/version&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;description&gt;Maven&nbsp;Demo&nbsp;Project&lt;/description&gt;<br />
<br />
&nbsp;&nbsp;&nbsp; &lt;modules&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;module&gt;demo-app&lt;/module&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;module&gt;demo-web&lt;/module&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/modules&gt;<br />
<br />
&nbsp;&nbsp;&nbsp; &lt;dependencyManagement&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;dependencies&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;dependency&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;groupId&gt;mvn.demo&lt;/groupId&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;artifactId&gt;demo-app&lt;/artifactId&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;version&gt;${project.version}&lt;/version&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/dependency&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;dependency&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;groupId&gt;mvn.demo&lt;/groupId&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;artifactId&gt;demo-web&lt;/artifactId&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;version&gt;${project.version}&lt;/version&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/dependency&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;dependency&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;groupId&gt;com.db4o&lt;/groupId&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;artifactId&gt;db4o-java5&lt;/artifactId&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;version&gt;</span><span style="color: #000000;">5.5</span><span style="color: #000000;">&lt;/version&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/dependency&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;dependency&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;groupId&gt;javax.servlet&lt;/groupId&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;artifactId&gt;servlet-api&lt;/artifactId&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;version&gt;</span><span style="color: #000000;">2.4</span><span style="color: #000000;">&lt;/version&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;scope&gt;provided&lt;/scope&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/dependency&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;dependency&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;groupId&gt;commons-configuration&lt;/groupId&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;artifactId&gt;commons-configuration&lt;/artifactId&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;version&gt;</span><span style="color: #000000;">1.2</span><span style="color: #000000;">&lt;/version&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;exclusions&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;exclusion&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;groupId&gt;dom4j&lt;/groupId&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;artifactId&gt;dom4j&lt;/artifactId&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/exclusion&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;exclusion&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;groupId&gt;xml-apis&lt;/groupId&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;artifactId&gt;xml-apis&lt;/artifactId&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/exclusion&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;exclusion&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;groupId&gt;xalan&lt;/groupId&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;artifactId&gt;xalan&lt;/artifactId&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/exclusion&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;exclusion&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;groupId&gt;xerces&lt;/groupId&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;artifactId&gt;xercesImpl&lt;/artifactId&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/exclusion&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/exclusions&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/dependency&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/dependencies&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/dependencyManagement&gt;<br />
<br />
&nbsp;&nbsp;&nbsp; &lt;dependencies&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;dependency&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;groupId&gt;junit&lt;/groupId&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;artifactId&gt;junit&lt;/artifactId&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;version&gt;</span><span style="color: #000000;">3.8.1</span><span style="color: #000000;">&lt;/version&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;scope&gt;test&lt;/scope&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/dependency&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/dependencies&gt;<br />
<br />
&nbsp;&nbsp;&nbsp; &lt;build&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;plugins&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;plugin&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;groupId&gt;org.apache.maven.plugins&lt;/groupId&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;artifactId&gt;maven-resources-plugin&lt;/artifactId&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;configuration&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;encoding&gt;UTF-</span><span style="color: #000000;">8</span><span style="color: #000000;">&lt;/encoding&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/configuration&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/plugin&gt;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;plugin&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;groupId&gt;org.apache.maven.plugins&lt;/groupId&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;artifactId&gt;maven-compiler-plugin&lt;/artifactId&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;configuration&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;source&gt;</span><span style="color: #000000;">1.5</span><span style="color: #000000;">&lt;/source&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;target&gt;</span><span style="color: #000000;">1.5</span><span style="color: #000000;">&lt;/target&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;encoding&gt;UTF-</span><span style="color: #000000;">8</span><span style="color: #000000;">&lt;/encoding&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/configuration&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/plugin&gt;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;plugin&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;groupId&gt;org.apache.maven.plugins&lt;/groupId&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;artifactId&gt;maven-jar-plugin&lt;/artifactId&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;configuration&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;archive&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;addMavenDescriptor&gt;false&lt;/addMavenDescriptor&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/archive&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/configuration&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/plugin&gt;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;plugin&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;groupId&gt;org.apache.maven.plugins&lt;/groupId&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;artifactId&gt;maven-war-plugin&lt;/artifactId&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;configuration&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;archive&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;addMavenDescriptor&gt;false&lt;/addMavenDescriptor&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/archive&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/configuration&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/plugin&gt;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;plugin&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;groupId&gt;org.apache.maven.plugins&lt;/groupId&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;artifactId&gt;maven-javadoc-plugin&lt;/artifactId&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;configuration&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;charset&gt;UTF16&lt;/charset&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/configuration&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/plugin&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/plugins&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/build&gt;<br />
&lt;/project&gt;<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" alt="" align="top" /></span></div>
&nbsp;&nbsp;&nbsp; 预定义工程的依赖关系，就是把会被子工程依赖的artifact的详细信息(groupId，artifactId，version，...)先声明到&lt;dependencyManagement&gt;中。然后子工程只需要声明使用某个artifact就可以了，即那时只需要设置groupId和artifactId(甚至更少)就可以了。</font> <font size="2"><strong>&lt;dependencyManagement&gt;中声明的artifact并不一定真的会被使用到</strong>。</font> <br />
<font size="2"><strong>2.1 声明依赖关系</strong> <br />
&nbsp;&nbsp;&nbsp; 根据实际情况，</font> <font size="2">该实例</font> <font size="2">需要使用db4o针对java5的产品包(jar文件)。由于该jar文件并不存在于Maven的中央仓库中，所以我们不能直接通过Maven获得该jar文件。我们只能另外下载db4o-5.5(Java版)的压缩包，然后从压缩包内获得db4o-java5.jar。得到该jar后，必须先将它安装到Maven的本地仓库中(安装方法参见资源[1]，主题"向本地仓库安装文件时要生成POM文件")，以备后面的使用。此处将该artifact的groupId定义为<font color="#0000ff">com.db4o</font>，artifactId定义为<font color="#0000ff">db4o-java5</font>，version自然就是5.5了(请见上述POM脚本)。<br />
</font><font size="2">&nbsp;&nbsp;&nbsp; 由于该实例最终是一个Web应用，所以它至少需要依赖Servlet的包(servlet-api-2.4.jar)，还需要commons-configuration-1.2.jar。这两个artifact都已经存在于Maven中央仓库中，所以我查找到它们后，按照Maven中央仓库的命名将它们声明到了&lt;dependencyManagement&gt;中(请见上述POM脚本)。junit是进行单元测试时使用的artifact，(假设)它肯定会被每个工程使用，所以没有将它设置到</font> <font size="2">&lt;dependencyManagement&gt;中，而直接设置到了</font> <font size="2">&lt;dependency&gt;中。</font> <br />
<font size="2">&nbsp;&nbsp;&nbsp; 细心的朋友肯定已经发现了，针对</font> <font size="2">commons-configuration的依赖声明处多了一些语句。从表面上看，应该是排除了4个artifact(dom4j，</font> <font size="-0"><font size="2"><span style="color: #000000;">xml-apis</span> </font></font><font size="2">，</font> <font size="-0"><font size="2"><span style="color: #000000;">xalan</span> </font></font><font size="2">和</font> <font size="-0"><font size="2"><span style="color: #000000;">xerces</span> </font></font><font size="2">)。不错，就是排除了这4个jar文件(artifact)。如果有兴趣的话，可以将整个&lt;exclusions&gt;元素删除，然后再尝试一下制作war文件。你会发现在WEB-INF/lib目录下存在着这4个artifact对应的jar文件。那我为什么要将它们&#8220;排除&#8221;呢？因为，它们是多余的！即，它们对于我的这个Web应用来说，根本就是无用的！<br />
&nbsp;&nbsp;&nbsp; Maven2加入了一个很好的特性：<strong>自动加载&#8220;依赖的依赖(Transitive Dependency)&#8221;</strong>。以commons-configuration为例。为了能够让它运行正常，我们实际上还需要其它一些jar(artifact)，如commons-collections，commons-lang，...。但这些artifact我都没有&#8220;显示&#8221;地声明需要依赖它们，但Maven会自动加载，因为</font> <font size="2">commons-configuration的POM文件将它们声明为了dependency</font> <font size="2">。<br />
&nbsp;&nbsp;&nbsp; 既然那个4个artifact是<font size="2">commons-configuration的依赖，为什么会认为它们是无用的呢？实际上，它们就不应该被声明到</font><font size="2">commons-configuration的依赖关系中。这是</font><font size="2">commons-configuration开发者的失误，他们没有将依赖关系整理清晰，而将一些确实既不是runtime，更不是compile-time需要的artifact放入到了依赖关系中。在Maven中央仓库中存在着很多这种情况，所以我们有时需要弄清楚&#8220;哪些文件是我们真正需要的，哪些是可以被清除的&#8221;。但有时候，很难做到一个不漏。正是由于这一原因，自动加载Transitive Dependency这一极好的特性，有时让人十分无奈 ^_^<br />
<strong>2.2 对插件进行基本配置</strong><br />
我们可以把对插件的全局性(如针对整个项目的)设置放到较高层次的POM文件中，因为它们被设置后，子工程们就会自然遵守它们，而且可以使每个子工程的情况都是一样的。<br />
&nbsp;&nbsp;&nbsp; 在第1节中，已经表明该工程使用JDK1.5平台，并且所有文件都使用UTF-8</font><font size="2">的编码方式</font><font size="2">。而Maven默认使用JDK1.3级别的javac编译器；默认使用本地编码方式(简体中文Windows操作系统默认使用GBK编码方式)处理文件。这样就必须对Maven进行适当设置，以满足工程的实际需要。<br />
</font><font size="2">&nbsp;&nbsp;&nbsp; 针对资源文件的处理<font color="#000000">，Maven使用maven-resources-plugin插件，需要将它的编码方式设置为UTF-8。编译Java源文件，是使用maven-compiler-plugin插件，需要将它的source(Java源文件)与target(class文件)的级别都设置为1.5，另外还要将它的encoding方式设置为UTF-8。（详细设置请见POM脚本）</font><br />
<br />
<strong><font size="3">3 demo-app工程</font><br />
</strong>demo-app工程是一个普通应用程序工程，它用于处理和数据库相关的操作，如针对数据库的增、删、改、查等基本功能。该工程POM文件的主要内容如下所示：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><span style="color: #000000;">&lt;project</span><span style="color: #000000;">&gt;<br />
&nbsp;&nbsp;&nbsp; ......</span><span style="color: #000000;"><br />
&nbsp;&nbsp;&nbsp; &lt;build&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;finalName&gt;app&lt;/finalName&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;directory&gt;target&lt;/directory&gt;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;sourceDirectory&gt;src/java&lt;/sourceDirectory&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;outputDirectory&gt;target/classes&lt;/outputDirectory&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;resources&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;resource&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;directory&gt;src/java&lt;/directory&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;excludes&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;exclude&gt;**/*.java&lt;/exclude&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/excludes&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/resource&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/resources&gt;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;testSourceDirectory&gt;src/test/java&lt;/testSourceDirectory&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;testOutputDirectory&gt;target/test-classes&lt;/testOutputDirectory&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;testResources&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;testResource&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;directory&gt;src/test/java&lt;/directory&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;excludes&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;exclude&gt;**/*.java&lt;/exclude&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/excludes&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/testResource&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/testResources&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/build&gt;<br />
&lt;/project&gt;<br />
</span></div>
&nbsp;&nbsp;&nbsp; 文章的开头已经提到，本实例将会使用定制的目录结构，但在前面却一字不提此事，现在将描述如何定制目录结构。Maven的标准目录结构其实是在Super POM中设置的，由于任何POM都会继承该POM，所以所有的工作都会默认使用标准目录结构。要定制目录，其实就是需要重新设置相关参数的值，即用新值覆盖Super POM中的值。<br />
</font></font></font><font size="-0"><font size="-0"><font size="-0"><font size="2"><font size="2"><font size="2"><span style="color: #000000;">[1]&lt;finalName&gt;，该元素指定了工程输出的artifact的名称，默认值为${artifactId}-${version}，此处修改为app。<br />
</span></font></font></font></font></font></font><font size="-0"><font size="-0"><font size="-0"><font size="2"><font size="2"><font size="2"><span style="color: #000000;">[2]&lt;directory&gt;，该元素指定了工程输出的目标目录。默认值为target，此处未修改变。<br />
</span></font></font></font></font></font></font><font size="-0"><font size="-0"><font size="-0"><font size="2"><font size="2"><font size="2"><span style="color: #000000;">[3]&lt;sourceDirectory&gt;，该元素指定了Java源文件所在的目录。默认值为src/main/java，此处修改为src/java。<br />
</span></font></font></font></font></font></font><font size="-0"><font size="-0"><font size="-0"><font size="2"><font size="2"><font size="2"><span style="color: #000000;">[4]&lt;outputDirectory&gt;，该元素指定了编译后的class文件的放置目录。默认值为target/classes，此处未作改变。<br />
</span></font></font></font></font></font></font><font size="-0"><font size="-0"><font size="-0"><font size="2"><font size="2"><font size="2"><span style="color: #000000;">[5]&lt;resources&gt;</span> </font></font></font></font></font></font><font size="-0"><font size="-0"><font size="-0"><font size="2"><font size="2"><font size="2"><span style="color: #000000;">&lt;resource&gt;，该元素指定了Java源文件使用的资源文件的存放目录。默认值为src/main/resources，此处修改为src/java。由于在编码Java源文件时，Maven会将资源路径中的文件全部拷贝到classes目录。而此时将Java资源文件目录与Java源文件目录，设置为同一目录，所以需要将.java文件排除在资源文件的范畴之外(</span> </font></font></font></font></font></font><font size="-0"><font size="-0"><font size="-0"><font size="2"><font size="2"><font size="2"><span style="color: #000000;">&lt;exclude&gt;**/*.java&lt;/exclude&gt;</span> </font></font></font></font></font></font><font size="-0"><font size="-0"><font size="-0"><font size="2"><font size="2"><font size="2"><span style="color: #000000;">)。<br />
[6]</span> </font></font></font></font></font></font><font size="-0"><font size="-0"><font size="-0"><font size="2"><font size="2"><font size="2"><span style="color: #000000;">&lt;testSourceDirectory&gt;，该元素指定了单元测试Java源文件的放置目录。默认值为src/test/java，此处未作修改。<br />
[7]</span> </font></font></font></font></font></font><font size="-0"><font size="-0"><font size="-0"><font size="2"><font size="2"><font size="2"><span style="color: #000000;">&lt;testOutputDirectory&gt;，该元素指定了单元测试Java源文件编译后的class文件放置目录。默认值为</span> </font></font></font></font></font></font><font size="-0"><font size="-0"><font size="-0"><font size="2"><font size="2"><font size="2"><span style="color: #000000;">target/test-classes，此处未作改变。<br />
[8]</span> </font></font></font></font></font></font><font size="-0"><font size="-0"><font size="-0"><font size="2"><font size="2"><font size="2"><span style="color: #000000;">&lt;testResources&gt;</span> </font></font></font></font></font></font><font size="-0"><font size="-0"><font size="-0"><font size="2"><font size="2"><font size="2"><span style="color: #000000;">&lt;testResource&gt;，该元素指定了单元测试Java源文件所使用的资源文件的放置目录。默认值为src/test/resources，此处修改为</span> </font></font></font></font></font></font><font size="-0"><font size="-0"><font size="-0"><font size="2"><font size="2"><font size="2"><span style="color: #000000;">src/test/java。并且也做了与</span> </font></font></font></font></font></font><font size="-0"><font size="-0"><font size="-0"><font size="2"><font size="2"><font size="2"><span style="color: #000000;">设置&lt;resources&gt;</span> </font></font></font></font></font></font><font size="-0"><font size="-0"><font size="-0"><font size="2"><font size="2"><font size="2"><span style="color: #000000;">&lt;resource&gt;时相同的处理(排除Java源文件)。<br />
&nbsp;&nbsp;&nbsp; 通过上述设置后，就可以拥有一个定制的Maven工程目录结构了。<br />
</span></font></font></font></font></font></font><font size="2"><font size="2"><font size="2"><br />
</font></font><font size="3"><strong>4 demo-web工程<br />
</strong></font>demo-web工程是整个应用最终的目标输出，因为此处的目的就是制作一个war文件，然后将它部署到JBoss服务器中。与demo-app工程相比，demo-web工程的POM文件主要有如下不同内容：<br />
</font>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">&lt;project</span> <span style="color: #000000;">&gt;<br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp; ......<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;build&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ......<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;plugins&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;plugin&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;groupId&gt;org.apache.maven.plugins&lt;/groupId&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;artifactId&gt;maven-war-plugin&lt;/artifactId&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;version&gt;</span> <span style="color: #000000;">2.0.1</span> <span style="color: #000000;">&lt;/version&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;configuration&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;webappDirectory&gt;target/${artifactId}&lt;/webappDirectory&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;warSourceDirectory&gt;src/webapp&lt;/warSourceDirectory&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/configuration&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/plugin&gt;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;plugin&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;groupId&gt;org.codehaus.mojo&lt;/groupId&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;artifactId&gt;jboss-maven-plugin&lt;/artifactId&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;version&gt;</span> <span style="color: #000000;">1.3.1</span> <span style="color: #000000;">&lt;/version&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;configuration&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;jbossHome&gt;E:/jboss-</span> <span style="color: #000000;">4.0.2</span> <span style="color: #000000;">&lt;/jbossHome&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;serverName&gt;default&lt;/serverName&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;fileName&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;${project.build.directory}/${project.build.finalName}.${project.packaging}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/fileName&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/configuration&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/plugin&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/plugins&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/build&gt;<br />
&lt;/project&gt;</span> </div>
<font size="2"><font size="2">可以看出不同之处就在于对maven-war-plguin及jboss-maven-plugin插件的配置与使用。<br />
&nbsp;&nbsp;&nbsp; Maven使用maven-war-plugin插件对Web工程制作war文件。由于本文使用了定制目录结构，这样则会使maven-war-plugin无法找到Web工程的Web Root目录(默认是src/main/webapp)，所以需要对该插件进行适当地配置。&lt;warSourceDirectory&gt;就是Web工程的Web Root目录，此处设置为；&lt;webappDirectory&gt;是制作war文件之前，相当于是一个被打开(exploded)的war文件的根目录(默认是target/artifactId-version)。<br />
&nbsp;&nbsp;&nbsp; 该工程的脚本中，还使用了一个JBoss插件。该插件可以将制作好的war文件部署(实质上是拷贝)到指定的JBoss部署目录中。&lt;jbossHome&gt;是JBoss的安装根目录，&lt;serverName&gt;指JBoss Server的名称，&lt;fileName&gt;是被部署war文件的名称。<br />
<br />
<font size="3"><strong>参考资源</strong></font><br />
[1]Maven入门--概念与实例. http://www.blogjava.net/jiangshachina/archive/2006/09/01/67080.html<br />
[2]Maven + Continuum Weed. http://www.blogjava.net/jiangshachina/archive/2006/09/11/68944.aspx<br />
[3]Maven POM Reference. http://maven.apache.org/pom.html<br />
[3]db4o. http://www.db4objects.com<br />
<font size="3"><strong>本文实例下载地址--</strong></font><a href="http://www.blogjava.net/files/jiangshachina/mvn-demo.rar"><font size="3"><strong>http://www.blogjava.net/files/jiangshachina/mvn-demo.rar</strong></font><br />
<br />
</a></font></font><img src ="http://www.blogjava.net/jiangshachina/aggbug/79093.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jiangshachina/" target="_blank">Sha Jiang</a> 2006-12-12 18:03 <a href="http://www.blogjava.net/jiangshachina/archive/2006/12/12/79093.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Maven插件使用收集(原)</title><link>http://www.blogjava.net/jiangshachina/archive/2006/11/24/83331.html</link><dc:creator>Sha Jiang</dc:creator><author>Sha Jiang</author><pubDate>Fri, 24 Nov 2006 09:50:00 GMT</pubDate><guid>http://www.blogjava.net/jiangshachina/archive/2006/11/24/83331.html</guid><wfw:comment>http://www.blogjava.net/jiangshachina/comments/83331.html</wfw:comment><comments>http://www.blogjava.net/jiangshachina/archive/2006/11/24/83331.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/jiangshachina/comments/commentRss/83331.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jiangshachina/services/trackbacks/83331.html</trackback:ping><description><![CDATA[<div align="center">
<font size="4">
<font size="3">
<strong><span style="font-size: 14pt;"><strong>Maven插件使用收集</strong>
</span></strong></font>
</font>
<br />
</div>
<font size="2">本文是Maven常用插件的收集，对于较复杂的使用会给出实例。每个插件都将以<font color="#0000ff">groupId:artifactId</font>的形式列出。但本文主要关注非Maven官方管理插件，如codehause.org的插件。不断更新中...(2007.02.13最后更新)<br />
<br />
<a href="http://mojo.codehaus.org/dependency-maven-plugin/">org.codehaus.mojo:dependency-maven-plugin</a><br />
该插件用于对工程依赖的artifact进行处理，如将所有被依赖的artifact拷贝到指定目录。<br />
注意：还有一个类似功能的插件--</font>
<font size="2">
<a href="http://maven.apache.org/plugins/maven-dependency-plugin/">maven:maven-dependency-plugin</a>，但安装它之后，在addPlugin时抛NullPointerException(请见<a href="/jiangshachina/archive/2006/09/11/68944.html">Maven+Continuum Weed</a>中的主题<font color="#008000"><font color="#006400">当加载插件时抛</font></font><font color="#006400">NullPointerException</font>)。</font>
<font size="2">
<br />
<br />
</font>
<font size="2">
<a href="http://mojo.codehaus.org/jboss-maven-plugin/">org.codehaus.mojo:jboss-maven-plugin</a>
</font>
<br />
<font size="2">该插件可以将Web工程部署到指定的JBoss服务器中。目前只会使用<font color="#0000ff">jboss:harddeploy</font>，所谓的硬部署就是将做好的war文件</font>
<font size="2">直接copy到JBoss deploy目录中</font>
<font size="2">。所以使用该goal之前，需要先制作好war文件。<br />
而对于该插件提供的<font color="#0000ff">jboss:deploy</font>，<font color="#0000ff">jboss:start</font>，<font color="#0000ff">jboss:stop</font>...等等goal还没有使用成功。<br />
<br />
</font>
<font size="2">
<a href="http://mojo.codehaus.org/tomcat-maven-plugin/introduction.html">org.codehaus.mojo:tomcat-maven-plugin</a>
<br />
该插件可以将Web工程部署到指定的Tomcat服务器中。它不仅可以部署war文件，还可以部署被打开的war目录。<br />
注：该插件目前没有提供下载。<br />
<br />
<a href="http://mojo.codehaus.org/minijar-maven-plugin/index.html">mojo.codehaus.org:minijar-maven-plugin</a><a href="http://mojo.codehaus.org/exec-maven-plugin/"><br />
<br />
</a></font>
<a href="http://mojo.codehaus.org/exec-maven-plugin/">
<font size="2">mojo.codehaus.org:</font>
<font size="2">exec-maven-plugin</font>
<font size="2">
</font>
</a>
<font size="2">
<br />
<br />
updating....</font><img src ="http://www.blogjava.net/jiangshachina/aggbug/83331.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jiangshachina/" target="_blank">Sha Jiang</a> 2006-11-24 17:50 <a href="http://www.blogjava.net/jiangshachina/archive/2006/11/24/83331.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Maven Weed(原)</title><link>http://www.blogjava.net/jiangshachina/archive/2006/09/11/68944.html</link><dc:creator>Sha Jiang</dc:creator><author>Sha Jiang</author><pubDate>Mon, 11 Sep 2006 05:37:00 GMT</pubDate><guid>http://www.blogjava.net/jiangshachina/archive/2006/09/11/68944.html</guid><wfw:comment>http://www.blogjava.net/jiangshachina/comments/68944.html</wfw:comment><comments>http://www.blogjava.net/jiangshachina/archive/2006/09/11/68944.html#Feedback</comments><slash:comments>34</slash:comments><wfw:commentRss>http://www.blogjava.net/jiangshachina/comments/commentRss/68944.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jiangshachina/services/trackbacks/68944.html</trackback:ping><description><![CDATA[<div align="center">
<font size="4">
<strong><span style="font-size: 14pt;"><strong>Maven Weed</strong>
</span></strong></font>
<br />
</div>
<font size="2">学习、使用Maven的过程中，亲身遇到或看到的一些问题的解决方法。Maven有不少Bug，大家使用时一定要小心。(2007.02.10最后更新)<br />
<br />
</font>
<font size="2">
<font size="3">
<strong>向本地仓库安装文件</strong>
</font>
<br />
&nbsp;&nbsp;&nbsp; <font color="#0000ff"><font color="#000000">mvn install:install-file -Dfile=&lt;path-to-file&gt; -DgroupId=&lt;group-id&gt; -DartifactId=&lt;artifact-id&gt; -Dversion=&lt;version&gt; -Dpackaging=&lt;packaging&gt; </font></font></font>
<font size="2">
<font color="#000000">-DgeneratePom=true -DcreateChecksum=true(需要使用maven-install-plugin 2.2-SNAPSHOT)</font>
</font>
<br />
<font size="2">
<br />
<font size="3">
<strong>打包时，不在META-INF中生成maven目录</strong>
</font>
<br />
&nbsp;&nbsp;&nbsp; 使用Maven打包(<font color="#000000">mvn package</font>)时，默认地会在META-INF中生成一个目录maven，里面是一个pom和一个属性文件。如果不想生成这个目录，需要在POM中进行如下配置：<br />
以对于一般应用程序打包，即制作jar包为例<br />
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: rgb(238, 238, 238);"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">build</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp; </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">plugins</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp; </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">plugin</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">groupId</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">org.apache.maven.plugins</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">groupId</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">artifactId</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">maven-jar-plugin</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">artifactId</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">configuration</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">archive</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">addMavenDescriptor</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">false</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">addMavenDescriptor</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">archive</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">configuration</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp; </span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">plugin</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp; </span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">plugins</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">build</span><span style="color: rgb(0, 0, 255);">&gt;</span></div>
如果你在打jar包（<font color="#0000ff">mvn package</font>）时，报如下错误：<br />
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: rgb(238, 238, 238);"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="font-weight: bold; color: rgb(128, 0, 0);">[</span><span style="color: rgb(128, 0, 0);">INFO</span><span style="font-weight: bold; color: rgb(128, 0, 0);">]</span><span style="color: rgb(0, 0, 0);">&nbsp;Failed&nbsp;to&nbsp;configure&nbsp;plugin&nbsp;parameters&nbsp;for:&nbsp;org.apache.maven.plugins:maven-jar-plugin:</span><span style="color: rgb(0, 0, 0);">2.0</span><span style="color: rgb(0, 0, 0);"><br />
Cause:&nbsp;Cannot&nbsp;find&nbsp;setter&nbsp;nor&nbsp;field&nbsp;in&nbsp;org.apache.maven.archiver.MavenArchiveConfiguration&nbsp; for&nbsp;'addMavenDescriptor'&nbsp;</span></div>
这是由于<font color="#0000ff">maven-jar-plugin</font>的版本不够高（很可能是2.0版本），需要升级到最新的2.1版本。运行命令<font color="#0000ff">mvn -U package</font>，会先下载最新版本，再执行打包操作。<br />
&nbsp;&nbsp;&nbsp; 类似的，对于制作war，ear包，只需要将artifactId换成对应的plugin（</font>
<font size="-0">
<font size="2">
<span style="color: rgb(0, 0, 0);">maven-war-plugin</span>
<span style="color: rgb(0, 0, 255);">，</span>
</font>
</font>
<font size="-0">
<font size="2">
<span style="color: rgb(0, 0, 0);">maven-ear-plugin</span>
<span style="color: rgb(0, 0, 255);">
</span>
</font>
</font>
<font size="2">）就可以了。<br />
<br />
<font size="3"><strong>Javadoc中文乱码</strong></font><br />
&nbsp;&nbsp;&nbsp; 中文操作系统中，JDK1.5.0的Javadoc自动默认支持中文，而且页面中的条目名也都默认为中文显示（在之前的JDK中，这些条目名都默认为英文）。</font>
<font size="2">如是在这种情况下使用命令<font color="#0000ff">mvn javadoc:javadoc</font>生成Javadoc，则这些条目名将成为乱码。<br />
&nbsp;&nbsp;&nbsp; 解决方法：让javadoc插件使用UTF16或Unicode字符集。具体配置的形式如下：<br />
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: rgb(238, 238, 238);"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">build</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp; </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">plugins</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp; </span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">plugin</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">groupId</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">org.apache.maven.plugins</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">groupId</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">artifactId</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">maven-javadoc-plugin</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">artifactId</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">configuration</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">charset</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">UTF16</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">charset</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">configuration</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">plugin</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp; </span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">plugins</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">build</span><span style="color: rgb(0, 0, 255);">&gt;</span></div>
<br />
<font size="3"><strong>Scope</strong></font><br />
Scope表示了某个依赖关系的适用范围(作用域)，共有5个scope。<br />
<strong>compile</strong>: 默认的适用范围，表示该依赖关系要应用于所有的classpath。<br />
<strong>provided</strong>: 该适用范围非常像compile适用范围。但它表示该依赖关系已经由JDK或某个容量提供，如javax.servlet。<br />
<strong>runtime</strong>：表示该依赖关系不用于编译阶段，而只使用于运行时阶段，如apache jakarta commons。<br />
<strong>test</strong>：表示该依赖关系并不用于实际的应用程序本身，而是该应用的测试程序的编译与运行，如junit。<br />
<strong>system</strong>：该依赖关系类似于provided，但必须显示地表示是哪一个容器提供了这个artifact。无法在仓库中找到该artifact。<br />
注意：<br />
[1]具有compile或runtime适用范围的依赖关系中的jar文件，制作war文件时将会被放入WEB-INF/lib目录中。<br />
[2]不推荐使用system适用范围。<br />
<br />
<font size="3"><strong>将mvn.bat配置为Eclipse外部工具</strong></font><br />
为了能够在Eclipse环境中运行mvn.bat，需要将它配置为一个外部工具(external tool)。在我的<a href="/jiangshachina/archive/2006/10/12/63436.html">Eclipse Weed</a>(配置外部工具)一文中已经提到了如何配置Eclipse External Tools(可先参见该文)。本主题将具体讲述如何将mvn.bat的package Build周期短语配置为外部工具。<br />
[1]主菜单<font color="#006400">Run--&gt;External Tools--&gt;External Tools...</font><br />
[2]先选中<font color="#006400">Program</font>项，再点击左上角的<font color="#006400">New launch configuration</font>按钮<br />
[3]<font color="#006400">Name</font>文本框中输入该外部工具的名称&#8220;MvnPackage&#8221;<br />
[4]通过<font color="#006400">Browser File System...</font>按钮，向<font color="#006400">Location</font>文本框中输入mvn.bat文件的绝对路径<br />
[5]通过<font color="#006400">Variables...</font>按钮，选择<font color="#006400">project_loc</font>，将向<font color="#006400">Working Directory</font>文本框中输入<font color="#006400">${project_loc}</font><br />
[6]在<font color="#006400">Augments</font>文本域中输入package<br />
这样当你选中一个pom.xml文件后，再运行该外部工具，就相当于对该POM文件文件执行<font color="#0000ff">mvn package</font>命令。<br />
<br />
<font size="3"><strong>制作war文件时，过滤文件</strong></font><br />
使用<font color="#006400">maven-war-plugin</font>制作war文件时，它会先将所有<strong>可能</strong>用于制作war的内容放入<font color="#0000ff">target/<em>artifactId-version</em></font>目录(标准目录结构)下，然后再将这些文件进行打包。这样就有两种方法进行文件过滤：[1]使期望被过滤的文件一开始就不被放入</font>
<font size="2">
<font color="#0000ff">target/<em>artifactId-version</em></font>目录，即使它成为<strong>不可能</strong>的文件；[2]在制作war文件时，不将期望被过滤的文件加入包中。</font>
<br />
<font size="2">[1]实现第一种方法，要对<font color="#006400">dependency</font>进行配置。将不希望加入包的artifact放入<font color="#006400">exclusion</font>参数中，如下脚本所示：<br />
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: rgb(238, 238, 238);"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">dependency</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">groupId</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">commons-configuration</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">groupId</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">artifactId</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">commons-configuration</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">artifactId</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">exclusions</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">exclusion</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">groupId</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">dom4j</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">groupId</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">artifactId</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">dom4j</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">artifactId</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">exclusion</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">exclusions</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">dependency</span><span style="color: rgb(0, 0, 255);">&gt;</span></div>
[2]实现第二种方法，要对<font color="#006400">maven-war-plugin</font>进行配置，将</font>
<font size="2">
<span style="color: rgb(0, 0, 0);">不希望加入包的资源文件(不再称之为artifact)放入<font color="#006400">warSourceExcludes</font>参数中，如下脚本所示：<br />
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: rgb(238, 238, 238);"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">build</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">plugins</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">plugin</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">groupId</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">org.apache.maven.plugins</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">groupId</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">artifactId</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">maven-war-plugin</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">artifactId</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">version</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">2.0.1</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">version</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">configuration</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;</span><span style="color: rgb(128, 0, 0);">warSourceExcludes</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);">WEB-INF/lib/dom4j-1.4.jar</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">warSourceExcludes</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">configuration</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">plugin</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">plugins</span><span style="color: rgb(0, 0, 255);">&gt;</span><span style="color: rgb(0, 0, 0);"><br />
</span><span style="color: rgb(0, 0, 255);">&lt;/</span><span style="color: rgb(128, 0, 0);">build</span><span style="color: rgb(0, 0, 255);">&gt;</span></div>
</span>
</font>
<font size="2">注意：上述方法都不仅仅是过滤掉dom4j的jar文件，它还会过滤掉dom4j所依赖的其它文件(artifact)。<br />
<br />
<font color="#000000" size="3"><strong>当加载插件时抛NullPointerException</strong></font><br />
如果仓库中有某个插件的jar文件有问题，则会抛出这样的异常。遇到这样的问题时，必须将这个有问题的插件清除。<br />
可以在执行参数中加上<font color="#0000ff">-X</font>(如<font color="#0000ff">mvn -X compile</font>)来获得加载插件的过程，从中可能会发现问题插件。如果还不行，则使用一个新的仓库，再次执行工程。<br />
<font size="3"><strong><br />
</strong></font></font>
<font size="3">
<strong>Install或Deploy源代码</strong>
</font>
<br />
<font size="-0">
<font size="2">
<span style="color: rgb(0, 0, 0);">
</span>
</font>
</font>
<font size="-0">
<font size="2">
<span style="color: rgb(0, 0, 0);">
<div style="border: 1px solid rgb(204, 204, 204); padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: rgb(238, 238, 238);">
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" alt="" align="top" />
<span style="color: rgb(0, 0, 0);">&lt;project&gt;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&lt;build&gt;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;plugins&gt;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;plugin&gt;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;inherited&gt;true&lt;/inherited&gt;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;groupId&gt;org.apache.maven.plugins&lt;/groupId&gt;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;artifactId&gt;maven-source-plugin&lt;/artifactId&gt;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;executions&gt;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;execution&gt;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;id&gt;attach-sources&lt;/id&gt;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;goals&gt;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;goal&gt;jar&lt;/goal&gt;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/goals&gt;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/execution&gt;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/executions&gt;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/plugin&gt;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/plugins&gt;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&lt;/build&gt;<br />
<img src="http://www.blogjava.net/images/OutliningIndicators/None.gif" alt="" align="top" />&lt;/project&gt;</span>
</div>
使用如上的脚本即可，但该脚本只能针对jar文件，而不能针对war或ear...文件。<font size="-0"><font size="2"><span style="color: rgb(0, 0, 0);">maven-source-plugin并没有提供install或deploy Web工程源代码的goal。</span></font></font><br />
<br />
<font size="3"><strong>在命令行中设置本地仓库</strong></font><br />
在使用Maven2命令(<font color="#0000ff">mvn</font>)时，可以设置本地仓库的路径，该路径将会替代<font color="#0000ff">settings.xml</font>中设置的本地仓库路径。<br />
如命令，<font color="#0000ff">mvn -Dmaven.repo.local=<em>Another_Local_Repo</em> package</font><br />
注：在Maven1中还可以通过<font color="#0000ff">-Dmaven.repo.remote</font>设置远程仓库，但目前在Maven2中还不行。<br />
<br />
</span>
</font>
</font>
<font size="-0">
<font size="2">
<span style="color: rgb(0, 0, 0);">
<font size="3">
<strong>在Maven发行包中找到Super POM文件</strong>
</font>
<br />
所有的POM都默认继承Super POM，该POM定义了Maven标准目录结构。但在Maven的发行包中，这个Super POM是存放在了哪里呢？<br />
这个POM就存放在maven-project的jar文件中。在笔者的机器中，该Super POM的位置是：<br />
<font color="#0000ff"><em>Maven_Home</em>/lib/maven-project-2.0.4.jar/org/apache/maven/project/pom-4.0.0.xml</font><br />
<br />
<font size="3"><strong>构建Maven远程仓库</strong></font><br />
构建Maven远程仓库的方法很多，也很简单。常用的Web服务器(Apache，JBoss，Tomcat，...)都可以用于构建Maven远程仓库；而发布artifact时，也可以使用多种协议(FTP，SFTP，SSH，...)。<br />
此处使用RedHat AS 4.0 + Apache2.0.59，并应用SSH协议向远程仓库发布artifact。<br />
[1]在Apache的DocumnetRoot中新建目录maven2/repo，此处该目录的绝对路径为<br />
/usr/local/apache2/htdocs/maven2/repo<br />
[2]在本地Maven的settings.xml文件中设置Server，语句的形式如下：<br />
&lt;servers&gt;<br />
&nbsp; &lt;server&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;id&gt;myrepo&lt;/id&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;username&gt;myuser&lt;/username&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;password&gt;mypasswd&lt;/password&gt;<br />
&nbsp; &lt;/server&gt;<br />
&lt;/servers&gt;<br />
myuser/mypasswd是登录远程Linux系统时使用的用户名/密码。<br />
[3]在本地工程的pom.xml中进行如下形式的设置：<br />
&lt;distributionManagement&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;repository&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;id&gt;myrepo&lt;/id&gt;<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &lt;url&gt;scp://Host/usr/local/apache2/htdocs/maven2/repo&lt;/url&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/repository&gt;<br />
&lt;/distributionManagement&gt;<br />
此处id必须与前面设置的server中的id一致；scp是使用SSH协议的文件传输命令；Host是远程Linux服务器的IP地址或域名；/usr/local/apache2/htdocs/maven2/repo就是Maven仓库在远程服务器中的绝对路径。<br />
[4]在本地中使用命令mvn deploy发布artifact到远程仓库中。<br />
[5]</span>
</font>
</font>
<font size="-0">
<font size="2">
<span style="color: rgb(0, 0, 0);">启动Apache服务器，</span>
</font>
</font>
<font size="-0">
<font size="2">
<span style="color: rgb(0, 0, 0);">通过地址http://Host/maven2/repo，就可以看到刚刚发布artifact了。<br />
<br />
updating...<br />
</span>
</font>
</font>
<img src ="http://www.blogjava.net/jiangshachina/aggbug/68944.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jiangshachina/" target="_blank">Sha Jiang</a> 2006-09-11 13:37 <a href="http://www.blogjava.net/jiangshachina/archive/2006/09/11/68944.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Continuum入门--实例(原)</title><link>http://www.blogjava.net/jiangshachina/archive/2006/09/09/68680.html</link><dc:creator>Sha Jiang</dc:creator><author>Sha Jiang</author><pubDate>Sat, 09 Sep 2006 03:32:00 GMT</pubDate><guid>http://www.blogjava.net/jiangshachina/archive/2006/09/09/68680.html</guid><wfw:comment>http://www.blogjava.net/jiangshachina/comments/68680.html</wfw:comment><comments>http://www.blogjava.net/jiangshachina/archive/2006/09/09/68680.html#Feedback</comments><slash:comments>10</slash:comments><wfw:commentRss>http://www.blogjava.net/jiangshachina/comments/commentRss/68680.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jiangshachina/services/trackbacks/68680.html</trackback:ping><description><![CDATA[<div align="center"><font size="4"><strong>Continuum入门--实例</strong> </font></div>
<font size="2">&nbsp;&nbsp;&nbsp; 本文虽然是Continuum的入门，但并不涉及Continuum的历史、下载与安装，这些内容可以到 Continuum的官方网站</font> <font size="2">(http://maven.apache.org/continuum/)</font> <font size="2">上了解。本文主要是以一个实例来阐述使用 Continuum的基本方法，而其中将使用的Maven工程是《Maven入门--概念与实例》中的实例（该文末有下载链接）。<br /><span style="font-size: 12pt; color: red;">注：转载时请注明原作者(jiangshachina)及出处(<a style="color: red;" href="http://www.blogjava.net/jiangshachina">http://www.blogjava.net/jiangshachina</a>)！</span><br /><br /><font size="3"><strong>1 使用持续集成的好处</strong></font><br /><strong>1.1 较早提交，经常提交</strong><br />&nbsp;&nbsp;&nbsp; 当开发者有规律性地提交文件时，持续集成将是最高效的。这就是意味着，不能提交不完全的代码，而是保持每次的改动不大，并且有很好的测试。这就可以更好地发现代码中的错误。<br /><strong>1.2 尽可能频繁的构建</strong><br />&nbsp;&nbsp;&nbsp; 频繁的Build可能要受到需要进行Build的工作量，以及进行Build工作的机器的性能的影响。但频繁的Build确实可以在开发人员转移注意力之前，尽可能早的发现错误。任何时候，任何一个提交的发生，Continuum都可以触发一个Build工作。这就意味着，这些Build工作应该更快，对于大量的Build工作或性能测试<br /><strong>1.3 创建一个稳定的环境</strong><br />&nbsp;&nbsp;&nbsp; 如果该Build不是其它开发，测试或产品环境中的一员，那么就可以避免定制JDK或其它的本地设置。如果在持续集成环境中，一个Build工作失败了，它会被从引起它的原因的修改中隔离出来，可以独立于运行环境来被使用。<br /><strong>1.4 运行干净的构建</strong><br />&nbsp;&nbsp;&nbsp; 快速、重复地构建是十分有用的，同样重要的是，不会由于旧的Build状态而发生失败的Build工作。有规律的考虑问题，就能得到干净的构建。Continuum默认就是进行干净的Build工作，未来它还可以允许开发者根据所选的时间表去请求一个初始的checkout。<br /><strong><font size="3">2 实例</font></strong><br /><strong>2.1 构想</strong><br />&nbsp;&nbsp; &nbsp;本实例中需要持续集成的Maven工程是<strong>《Maven入门--概念与实例》</strong>中的Demo。使用的SCM是Subversion，即假定已经安装好了Subversion服务器和命令行客户端。我们的目标是使用Continuum对Maven工程demo（包括它的子工程）进行定时的持续集成。在本文的环境中有如下路径：<br />&nbsp;&nbsp; &nbsp;<font color="#0000ff"><em>Continuum_Home</em>=D:\continuum<br />&nbsp;&nbsp;&nbsp; <em>SVN_Repoitory</em>=E:\svn-repo\repository<br />&nbsp;&nbsp; &nbsp;<em>Maven_Demo</em>=D:\maven\demo<br />&nbsp;&nbsp; &nbsp;<em>Continuum_Maven</em>=D:\maven\continuum</font>&nbsp; // 该目录存放从Subversion下载的Maven Demo工程<br /><strong>2.2 初始化Subversion仓库</strong><br />&nbsp;&nbsp; &nbsp;生成仓库：<font color="#0000ff">svnadmin create <em>SVN_Repository</em></font><br />&nbsp;&nbsp; &nbsp;将Maven_Demo中的文件导入到仓库：<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font color="#0000ff">svn import Maven_Demo file:///<em>SVN_Repoitory</em>/demo -m "initial import demo"</font><br />&nbsp;&nbsp; &nbsp;重新下载仓库中的文件(在目录Continuum_Maven中运行如下命令)：<br />&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;<font color="#0000ff">svn checkout file:///<em>SVN_Repoitory</em>/demo demo</font><br /><strong>2.3 启动Continuum</strong><br />&nbsp;&nbsp; &nbsp;假设此时已经安装了Continuum，但还没有运行它。要运行Continuum，可以双击<font color="#0000ff"><em>Continuum_Home</em>\bin\win32\run.bat</font>文件。对于第一次运行，会报一些错误：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000;">&#8230;&#8230;<br />WARN&nbsp;&nbsp;RDBMS&nbsp;-&nbsp;Error&nbsp;initialising&nbsp;derby&nbsp;schema&nbsp;:&nbsp;Schema&nbsp;'SA'&nbsp;does&nbsp;not&nbsp;exist<br />ERROR&nbsp;42Y07:&nbsp;Schema&nbsp;'SA'&nbsp;does&nbsp;not&nbsp;exist<br />&#8230;&#8230;</span></div>
这种情况是正常的，因为Continuum后台使用的是Apache Derby数据库，在第一次运行之前，Continuum所需要的一些表和数据并不存在。但Continuum会初始化这些数据，当第2次启动Continuum时，这些错误就不会出现了。<br />&nbsp;&nbsp; &nbsp;Continuum服务器默认使用8080端口，如果之前该端口已被占用了，那么启动将失败。为了解决这个问题，我们需要修改jar文件<font color="#0000ff"><em>Continuum_Home</em>\apps\continuum-plexus-application-1.0.3.jar</font>中的<font color="#0000ff">\conf\application.xml</font>文件。在该文件中查找<strong>8080</strong>(该值是唯一的)，将改它为你所指定的端口值，本文是使用<strong>8081</strong>。经过上述过程后，Continuum服务器应该就可以正常启动了。下面将讨论Continuum的初始化配置。<br /><strong>2.4 初始化配置</strong><br />&nbsp;&nbsp; &nbsp;在浏览器中使用地址<font color="#0000ff"><a href="http://localhost:8081/continuum">http://localhost:8081/continuum</a></font>登录Continuum控制台界面，如下图所示。<br /><img alt="Continuum01.gif" src="http://www.blogjava.net/images/blogjava_net/jiangshachina/continuum/Continuum01.gif" border="0" height="400" width="550" /><br />第一次登录Continuum后，需要进行一些配置。主要包括用户名/密码，工作区目录，Build输出目录以及公司信息。主要参数值如下所示：<br /><font color="#0000ff">&nbsp;&nbsp;&nbsp; Working Directory=D:\continuum\workspace&nbsp;<br />&nbsp;&nbsp;&nbsp; Build Output Directory=D:\continuum\workspace\output<br />&nbsp;&nbsp;&nbsp; Base URL=http://localhost:8081/continuum/servlet/continuum<br />&nbsp;&nbsp;&nbsp; <font color="#000000">// 这里的Company信息就借用此Blog站点的信息吧 *_*</font><br />&nbsp;&nbsp;&nbsp; Company Name=BlogJava<br />&nbsp;&nbsp;&nbsp; Company Logo=http://www.blogjava.net/images/logo.gif<br />&nbsp;&nbsp;&nbsp; Company URL=http://www.blogjava.net/</font>&nbsp;<br />提交之后会出现如下画面（能够看到BlogJava的logo吗 *_*）<br /><img alt="Continuum02.gif" src="http://www.blogjava.net/images/blogjava_net/jiangshachina/continuum/Continuum02.gif" border="0" height="400" width="550" /><br />使用初始配置时设置的用户名及密码，就可以登录Continuum控制台了。<br /><strong>2.5 修改POM文件</strong><br />&nbsp;&nbsp; &nbsp;在目录<em>Continuum_Maven</em>中执行如下命令，将Maven工程demo重新下载一次<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font color="#0000ff">svn checkout file:///<em>SVN_Repository</em>/demo demo</font><br />为了能被Continuum使用，且能与Subversion进行配合，需要对原来Maven工程中的POM文件进行修改。在每个POM中加入如下形式的语句：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">project</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />&nbsp;&nbsp;&#8230;&#8230;<br />&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">ciManagement</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">system</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">Continuum</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">system</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">url</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">http://localhost:8081/continuum/servlet/continuum</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">url</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">notifiers</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">notifier</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">type</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">mail</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">type</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">address</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">jiangshachina@163.com</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">address</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">notifier</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">notifiers</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">ciManagement</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">scm</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">connection</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">scm:svn:file://localhost/<em>SVN_Repository</em>/<em>ProjectName</em></span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">connection</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">scm</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />&nbsp;&nbsp;&#8230;&#8230;<br /></span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">project</span><span style="color: #0000ff;">&gt;</span></div>
其中<em>ProjectName</em>要与POM当前所在工程名一致，如对于demo目录中的POM，<em>ProjectName</em>就是demo。这三个文件修改完毕之后，将它们都提交到Subversion服务器中，在<strong>各个POM的当前目录</strong>下执行命令：<br />&nbsp;&nbsp; &nbsp;<font color="#0000ff">svn commit pom.xml -m "my settings"</font><br />为了每个工程都可以被单独地运行，需要将整个demo及其子工程都安装到Maven仓库中，仅需要在<strong><em>Maven_Demo</em></strong></font> <font size="2"><strong>目录</strong>下执行命令：<br />&nbsp;&nbsp; &nbsp;<font color="#0000ff">mvn install</font><br /><strong>2.6 添加Maven工程<br /></strong>&nbsp;&nbsp; &nbsp;登录到Continuum控制台后，点击左边&#8220;Add Project&#8221;组中的&#8220;Maven 2.0+ Project&#8221;。添加Maven2工程有两种情况：输入POM文件的URL；直接上传POM文件。前者适用于任何Maven工程；后者只能适用于没有module，即无子工程的Maven工程。由于本文使用的Maven工程demo中有两个子工程，所以只能使用前一种方法。<br /></font><img alt="Continuum03.gif" src="http://www.blogjava.net/images/blogjava_net/jiangshachina/continuum/Continuum03.gif" border="0" height="400" width="550" /> <font size="2"></font><br /><font size="2">&nbsp;&nbsp; &nbsp;只需要加载顶层工程的POM文件，Continuum会自动加载其它moudel的POM文件。如上图所示，在M2 POM Url中输入：<font color="#0000ff"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; file:///D:/maven/continuum/Demo/pom.xml</font><br />提交之后会看到如下的画面，即表示Maven工程已经被正确地加载到Continuum中了。<br /><img alt="Continuum04.gif" src="http://www.blogjava.net/images/blogjava_net/jiangshachina/continuum/Continuum04.gif" border="0" height="400" width="550" /><br />&nbsp;&nbsp;&nbsp; 加载工程时，Continuum会将这些工程分别下载到<strong>Working Directory</strong>（见2.4节）中，并在</font> <font size="2"><strong>Build Output Directory</strong>（见2.4节）中为每个工程</font> <font size="2">生成一个输出目录（开始只有一些log文件）。细心的朋友可能会发现，当上述工作完成之后，子工程&#8220;CE Maven Demo &#8211; App&#8221;和&#8220;CE Maven Demo &#8211; WebApp&#8221;的Build状态仍然是&#8220;Queued Build&#8221;。其实这是Continuum的一个Bug!Continnum在许多情况下不会自动刷新页面，需要手动刷新，即点击&#8220;Show projects&#8221;按钮。<strong>但请不要使用浏览器中的refresh按钮，这样可能会重新提交你的请求。</strong><em>这个Bug将在Continuum1.1中被修复</em>。当页面刷新之后，App和WebApp的Build状态将与Demo工程一致。<br /><strong>2.7 第一次Build</strong><br />&nbsp;&nbsp;&nbsp; 要Build任何一个Maven工程都十分简单，只需要点击某个工程右边&#8220;Build Now&#8221;按钮就可以Build该工程了。如我们点击demo工程对应的&#8220;Build Now&#8221;按钮，那么Continuum将按照demo中的POM文件执行Build工作。当Build完成后，可以显示本次Build的结果状态：成功，失败或错误(但请随时手动刷新页面^_^)。而Build次数也将从0改变为1。<br /><img alt="Continuum09.gif" src="http://www.blogjava.net/images/blogjava_net/jiangshachina/continuum/Continuum09.gif" border="0" height="400" width="550" /><br />&nbsp;&nbsp;&nbsp; 点击上图表格中的列&#8220;Build&#8221;中的数字，将可以看到本次Build的详细过程，如下图所示。<br /><img alt="continuum10.gif" src="http://www.blogjava.net/images/blogjava_net/jiangshachina/continuum/continuum10.gif" border="0" height="400" width="550" /><br /><strong>2.8 设置时间表</strong><br />&nbsp;&nbsp;&nbsp; 前面已经谈过，持续集成就需要进行有规律的Build。即需要建立一个时间表，让持续集成服务器按照这个表进行Build。Continuum默认的时间表为：每天的每一个整点进行一次Build，即每天每隔一小时Build一次。我们也可以建立自己的时间表。点击Administration组中的&#8220;Schedules&#8221;按钮就可以发现当前默认使用的时间表，再点击&#8220;Add&#8221;按钮就可以添加新的时间表了，如下图所示。<br /><img alt="Continuum06.gif" src="http://www.blogjava.net/images/blogjava_net/jiangshachina/continuum/Continuum06.gif" border="0" height="400" width="550" /><br />&nbsp;&nbsp;&nbsp; 这些参数项中最关键的是Cron Expression，它定义了Continuum执行Build的时间规则，它的语法规则请见参加资源[4]。上图中规定的时间表是：在每天的14:00-14:59之间，每分钟都要进行一次Build。勾选上Enable复选框之后，再提交，该Schedule就可以被使用了。<br />&nbsp;&nbsp;&nbsp; 为了使用新建的Schedule，我们需要进入工程视图页面。点击&#8220;Show Projects&#8221;--&gt;工程名(如CE Maven Demo)，就可以看到该工程的详细信息，如下图所示。<br /><img alt="Continuum07.gif" src="http://www.blogjava.net/images/blogjava_net/jiangshachina/continuum/Continuum07.gif" border="0" height="400" width="550" /><br />&nbsp;&nbsp;&nbsp; 在工程视图的Build Definitions项的Goals中可以发现，使用的Schedule就是&#8220;DEFAULT_SCHEDULE&#8221;时间表。再点击&#8220;Add&#8221;按钮，并在Schedule下拉列表框中，请选择刚刚新建的&#8220;My First Schedule&#8221;时间表(如下图所示)，最后再提交后，新的时间表将被采用。<br /><img alt="Continuum08.gif" src="http://www.blogjava.net/images/blogjava_net/jiangshachina/continuum/Continuum08.gif" border="0" height="400" width="550" /><br /><font size="3"><strong>4 小结</strong></font><br />&nbsp;&nbsp;&nbsp; 根据前面的描述，应该可以对Continuum的使用有些感性上的认识了。由于Continuum是Maven的子项目，它内置支持Maven2，所以能够与Maven进行良好的集成使用。现时，Continuum也能够支持Ant与Shell脚本工程。使用Continuum+Maven，能够对工程进行干净与频繁的集成，可以提高Build效率并能促进工程的健康发展。<br /><font size="3"><strong>5 参数资源</strong></font><br />[1]Continuum官方网站. <a href="http://maven.apache.org/continuum/">http://maven.apache.org/continuum/</a><br />[2]Continuum的参考文档. <a href="http://maven.apache.org/continuum/guides/index.html">http://maven.apache.org/continuum/guides/index.html</a><br />[3]Better Build with Maven. <a href="http://www.mergere.com/m2book_download.jsp">http://www.mergere.com/m2book_download.jsp</a><br />[4]Cron Expression语法规则. <a href="http://www.opensymphony.com/quartz/api/org/quartz/CronTrigger.html">http://www.opensymphony.com/quartz/api/org/quartz/CronTrigger.html</a><br /></font><img src ="http://www.blogjava.net/jiangshachina/aggbug/68680.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jiangshachina/" target="_blank">Sha Jiang</a> 2006-09-09 11:32 <a href="http://www.blogjava.net/jiangshachina/archive/2006/09/09/68680.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Maven入门--概念与实例(原)</title><link>http://www.blogjava.net/jiangshachina/archive/2006/09/01/67080.html</link><dc:creator>Sha Jiang</dc:creator><author>Sha Jiang</author><pubDate>Fri, 01 Sep 2006 05:43:00 GMT</pubDate><guid>http://www.blogjava.net/jiangshachina/archive/2006/09/01/67080.html</guid><wfw:comment>http://www.blogjava.net/jiangshachina/comments/67080.html</wfw:comment><comments>http://www.blogjava.net/jiangshachina/archive/2006/09/01/67080.html#Feedback</comments><slash:comments>21</slash:comments><wfw:commentRss>http://www.blogjava.net/jiangshachina/comments/commentRss/67080.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jiangshachina/services/trackbacks/67080.html</trackback:ping><description><![CDATA[<div align="center"><font size="4"><strong>Maven入门--概念与实例</strong> </font><br />
</div>
<font size="2"><font size="3"><font size="2">&nbsp;&nbsp;&nbsp; 最近由于工作原因在研究、应用Maven，有了一些体会就写成了此文。本文虽然是Maven2的入门文章，但并不涉及Maven的历史、下载与安装，这些内容可以到Maven的官方网站上了解。本文主要是关注Maven中的重要概念，并以一个实例来阐述使用Maven的基本方法。<strong>文末有例子代码下载的链接</strong>。(2007.01.02最后更新)</font> <br />
<span style="font-size: 12pt; color: red;">注：转载时请注明原作者(jiangshachina)及出处(<a style="color: red;" href="http://www.blogjava.net/jiangshachina">http://www.blogjava.net/jiangshachina</a>)！</span><br />
<br />
<strong>1 关键名词</strong> </font><br />
&nbsp;&nbsp;&nbsp; <strong>Project</strong>：任何您想build的事物，Maven都可以认为它们是工程。这些工程被定义为工程对象模型(POM，Poject Object Model)。一个工程可以依赖其它的工程；一个工程也可以由多个子工程构成。<br />
&nbsp;&nbsp;&nbsp; <strong>POM</strong>：POM(pom.xml)是Maven的核心文件，它是指示Maven如何工作的元数据文件，类似于Ant中的build.xml文件。POM文件位于每个工程的根目录中。<br />
&nbsp;&nbsp;&nbsp; <strong>GroupId</strong>：groupId是一个工程的在全局中唯一的标识符，一般地，它就是工程名。groupId有利于使用一个完全的包名，将一个工程从其它有类似名称的工程里区别出来。<br />
&nbsp;&nbsp;&nbsp; <strong>Artifact</strong>：artifact是工程将要产生或需要使用的文件，它可以是jar文件，源文件，二进制文件，war文件，甚至是pom文件。每个artifact都由groupId和artifactId组合的标识符唯一识别。需要被使用(依赖)的artifact都要放在仓库(见Repository)中，否则Maven无法找到(识别)它们。<br />
&nbsp;&nbsp;&nbsp; <strong>Dependency</strong>：为了能够build或运行，一个典型的Java工程会依赖其它的包。在Maven中，这些被依赖的包就被称为dependency。dependency一般是其它工程的artifact。<br />
&nbsp;&nbsp;&nbsp; <strong>Plug-in</strong>：Maven是由插件组织的，它的每一个功能都是由插件提供的。插件提供goal(类似于Ant中的target)，并根据在POM中找到的元数据去完成工作。主要的Maven插件要是由Java写成的，但它也支持用Beanshell或Ant脚本写成的插件。<br />
&nbsp;&nbsp;&nbsp; <strong>Repository</strong>：仓库用于存放artifact，它可以是本地仓库，也可以是远程仓库。Maven有一个默认的远程仓库--central，可以从<font color="#0000ff">http://www.ibiblio.org/maven2/</font>下载其中的artifact。在Windows平台上，本地仓库的默认地址是<font color="#0000ff"><em>User_Home</em>\.m2\repository</font>。<br />
&nbsp;&nbsp;&nbsp; <strong>Snapshot</strong>：工程中可以(也应该)有一个特殊版本，它的版本号包括<em>SNAPSHOT</em>字样。该版本可以告诉Maven，该工程正处于开发阶段，会经常更新(但还未发布)。当其它工程使用此类型版本的artifact时，Maven会在仓库中寻找该artifact的最新版本，并自动下载、使用该最新版。<br />
<strong><font size="3">2 Maven Build Life Cycle</font></strong><br />
&nbsp;&nbsp;&nbsp; 软件项目一般都有相似的开发过程：准备，编译，测试，打包和部署，Maven将上述过程称为Build Life Cycle。在Maven中，这些生命周期由一系列的短语组成，每个短语对应着一个(或多个)操作；或对应着一个(或多个)goal(类似于Ant中的target)。<br />
&nbsp;&nbsp;&nbsp; 如编译源文件的命令<font color="#0000ff">mvn compile</font>中的compile是一个生命周期短语。同时该命令也可以等价于<font color="#0000ff">mvn compiler:compile</font>，其中的compiler是一个插件，它提供了compile(<strong>此compile与mvn compile中的compile意义不同</strong>)goal；compiler还可提供另一个goal--testCompile，该goal用于编译junit测试类。<br />
&nbsp;&nbsp;&nbsp; 在执行某一个生命周期时，Maven会首先执行该生命周期之前的其它周期。如要执行compile，那么将首先执行validate，generate-source，process-source和generate-resources，最后再执行compile本身。<em>关于Maven中默认的生命周期短语，请见参考资源[6]中的附录B.3</em>。<br />
<font size="3"><strong>3 标准目录布局</strong></font><br />
&nbsp;&nbsp;&nbsp; Maven为工程中的源文件，资源文件，配置文件，生成的输出和文档都制定了一个标准的目录结构。Maven鼓励使用标准目录布局，这样就不需要进行额外的配置，而且有助于各个不同工程之间的联接。当然，Maven也允许定制个性的目录布局，这就需要进行更多的配置。<em>关于Maven的标准目录布局，请见参考资源[6]中的附录B.1</em>。<br />
<strong><font size="3">4 Maven的优点</font></strong><br />
&nbsp;&nbsp;&nbsp; [1]build逻辑可以被重用。在Ant中可能需要多次重复地写相同的语句，但由于POM的继承性，可以复用其它的POM文件中的语句。这样既可以写出清晰的build语句，又可以构造出层次关系良好的build工程。<br />
&nbsp;&nbsp;&nbsp; [2]不必关注build工作的实现细节。我们只需要使用一些build生命周期短语就可以达到我们的目标，而不必管Maven是如何做到这些的。如，只需要告诉Maven要安装(install)，那么它自然就会验证，编译，打包，及安装。<br />
&nbsp;&nbsp;&nbsp; [3]Maven会自动加载工程依赖的artifact所依赖的其它artifact(Transitive Dependency)，而不用显示的将这些artifact全部写到dependency中。<br />
&nbsp;&nbsp;&nbsp; [4]如果完全使用Maven的标准目录布局，那么可以极大地减少配置细节。<br />
<font size="3"><strong>5 实例</strong></font><br />
<strong>5.1 构想</strong><br />
&nbsp;&nbsp;&nbsp; 由于只是阐述Maven的基本使用方法，所以本文将要设计的实例，只是一个简单的Maven demo。该实例包含两个工程：普通应用程序工程(app)和Web应用工程(webapp)。app工程提供一个简单的Java类；webapp工程只包含一个Servlet，并将使用app中的Java类。<br />
&nbsp;&nbsp;&nbsp; 该Demo的目标是能够正确地将webapp制成war包，以供部署时使用。要能够正确制作war，自然首先就必须要能够正确的编译源代码，且要将App模块制成jar包。本文创建的工程所在的目录是<font color="#0000ff">D:\maven\demo</font>。<br />
<strong>5.2 App工程</strong><br />
&nbsp;&nbsp;&nbsp; 可以使用Maven的archetype插件来创建新工程，命令如下：<br />
&nbsp;&nbsp;&nbsp; <font color="#0000ff">D:\maven\demo&gt;mvn archetype:create -DgroupId=ce.demo.mvn -DartifactId=app</font><br />
该工程的groupId是ce.demo.mvn，那么该工程的源文件将放在Java包ce.demo.mvn中。artifactId是app，那么该工程根目录的名称将为app。<br />
&nbsp;&nbsp;&nbsp; 当第一次执行该命令时，Maven会从central仓库中下载一些文件。这些文件包含插件archetype，以及它所依赖的其它包。该命令执行完毕后，在目录D:\maven\demo下会出现如下目录布局：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">app<br />
|--&nbsp;pom.xml<br />
`--&nbsp;src<br />
&nbsp;&nbsp;&nbsp;&nbsp;|--&nbsp;main<br />
&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;`--&nbsp;java<br />
&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`--&nbsp;ce<br />
&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`--&nbsp;demo<br />
&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`--&nbsp;mvn<br />
&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`--&nbsp;App.java<br />
&nbsp;&nbsp;&nbsp;&nbsp;`--&nbsp;test<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`--&nbsp;java<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`--&nbsp;ce<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`--&nbsp;demo<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`--&nbsp;mvn<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`--&nbsp;AppTest.java</span></div>
因本文暂时不涉及JUnit测试，故请将目录<font color="#0000ff">app\src\test</font>目录删除(不删除也没关系 ^_^)。然后再修改App.java文件，其完全内容如下：<br />
<font color="#008000">
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" alt="" align="top" /><span style="color: #0000ff;">package</span><span style="color: #000000;">&nbsp;ce.demo.mvn;<br />
<img id="Codehighlighter1_38_105_Open_Image" onclick="this.style.display='none'; codehighlighter1_38_105_open_text.style.display=" none=""  ;="" codehighlighter1_38_105_closed_image.style.="" codehighlighter1_38_105_closed_text.style.="" display="'inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" alt="" align="top"><img id="Codehighlighter1_38_105_Closed_Image" style="display: none;" onclick="this.style.display='none'; codehighlighter1_38_105_closed_text.style.display=" none=""  ;="" codehighlighter1_38_105_open_image.style.="" codehighlighter1_38_105_open_text.style.="" display="'inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" alt="" align="top"></span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;App&nbsp;</span><span id="Codehighlighter1_38_105_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img src="http://www.blogjava.net/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_38_105_Open_Text"><span style="color: #000000;">{<br />
<img id="Codehighlighter1_77_103_Open_Image" onclick="this.style.display='none'; codehighlighter1_77_103_open_text.style.display=" none=""  ;="" codehighlighter1_77_103_closed_image.style.="" codehighlighter1_77_103_closed_text.style.="" display="'inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" alt="" align="top"><img id="Codehighlighter1_77_103_Closed_Image" style="display: none;" onclick="this.style.display='none'; codehighlighter1_77_103_closed_text.style.display=" none=""  ;="" codehighlighter1_77_103_open_image.style.="" codehighlighter1_77_103_open_text.style.="" display="'inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" alt="" align="top">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;String&nbsp;getStr(String&nbsp;str)&nbsp;</span><span id="Codehighlighter1_77_103_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img src="http://www.blogjava.net/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_77_103_Open_Text"><span style="color: #000000;">{<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;str;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000;"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif" alt="" align="top" />}</span></span></div>
</font>其实，如果我们能够清楚地知道Maven的标准目录布局，就可以不使用archetype插件来创建工程原型；如果我们要定制个性的目录布局，那么就更没有必要使用archetype插件了。<br />
<strong>5.3 WebApp工程</strong><br />
&nbsp;&nbsp;&nbsp; 我们仍然如创建app工程一样使用archetype插件来创建webapp工程，命令如下：<br />
&nbsp;&nbsp;&nbsp; <font color="#0000ff">D:\maven\demo&gt;mvn archetype:create -DgroupId=ce.demo.mvn -DartifactId=webapp -DarchetypeArtifactId=maven-archetype-webapp</font><br />
&nbsp;&nbsp;&nbsp; 第一次运行此命令时，也会从central仓库中下载一些与Web应用相关的artifact(如javax.servlet)。此命令与创建app的命令的不同之处是，多设置了一个属性archetypeArtifacttId，该属性的值为maven-archetype-webapp。即告诉Maven，将要创建的工程是一个Web应用工程。创建app工程时没有使用该属性值，是由于archetype默认创建的是应用程序工程。同样的，执行完该命令之后，会出现如下标准目录布局：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">webapp<br />
|--&nbsp;pom.xml<br />
`--&nbsp;src<br />
&nbsp;&nbsp;&nbsp;&nbsp;`--&nbsp;main<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;`--&nbsp;webapp<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><font size="-0"><font size="2"><span style="color: #000000;">|</span></font></font><span style="color: #000000;">--&nbsp;index.jsp<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |--&nbsp;WEB-INF<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; `--&nbsp;web.xml</span></div>
&nbsp;&nbsp;&nbsp; 根据5.1节的构想，webapp工程将只包含一个Servlet，所以我们不需要index.jsp文件，请将其删除。此时大家可以发现，目前的目录布局中并没有放Servlet，即Java源文件的地方。根据参考资源[6]中的附录B.1，以及app工程中Java源文件的布局，可以知道Servlet（它仍然是一个Java类文件）仍然是放在<font color="#0000ff">webapp\src\main\java</font>目录中，请新建该目录。此处的Servlet是一个简单HelloServlet，其完整代码如下：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><font color="#008000"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" alt="" align="top" /></font><span style="color: #0000ff;">package</span><span style="color: #000000;">&nbsp;hello;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" alt="" align="top" /><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" alt="" align="top" /></span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;java.io.IOException;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" alt="" align="top" /></span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;java.io.PrintWriter;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" alt="" align="top" /></span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;javax.servlet.ServletException;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" alt="" align="top" /></span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;javax.servlet.http.HttpServlet;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" alt="" align="top" /></span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;javax.servlet.http.HttpServletRequest;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" alt="" align="top" /></span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;javax.servlet.http.HttpServletResponse;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" alt="" align="top" /><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" alt="" align="top" /></span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;ce.demo.mvn.App;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;引用app工程中的App类</span><span style="color: #008000;"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" alt="" align="top" /></span><span style="color: #000000;"><br />
<img id="Codehighlighter1_333_776_Open_Image" onclick="this.style.display='none'; codehighlighter1_333_776_open_text.style.display=" none=""  ;="" codehighlighter1_333_776_closed_image.style.="" codehighlighter1_333_776_closed_text.style.="" display="'inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" alt="" align="top"><img id="Codehighlighter1_333_776_Closed_Image" style="display: none;" onclick="this.style.display='none'; codehighlighter1_333_776_closed_text.style.display=" none=""  ;="" codehighlighter1_333_776_open_image.style.="" codehighlighter1_333_776_open_text.style.="" display="'inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" alt="" align="top"></span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;HelloServlet&nbsp;</span><span style="color: #0000ff;">extends</span><span style="color: #000000;">&nbsp;HttpServlet&nbsp;</span><span id="Codehighlighter1_333_776_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img src="http://www.blogjava.net/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_333_776_Open_Text"><span style="color: #000000;">{<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">final</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">long</span><span style="color: #000000;">&nbsp;serialVersionUID&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">-</span><span style="color: #000000;">3696470690560528247L</span><span style="color: #000000;">;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;doGet(HttpServletRequest&nbsp;request,&nbsp;HttpServletResponse&nbsp;response)<br />
<img id="Codehighlighter1_536_774_Open_Image" onclick="this.style.display='none'; codehighlighter1_536_774_open_text.style.display=" none=""  ;="" codehighlighter1_536_774_closed_image.style.="" codehighlighter1_536_774_closed_text.style.="" display="'inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" alt="" align="top"><img id="Codehighlighter1_536_774_Closed_Image" style="display: none;" onclick="this.style.display='none'; codehighlighter1_536_774_closed_text.style.display=" none=""  ;="" codehighlighter1_536_774_open_image.style.="" codehighlighter1_536_774_open_text.style.="" display="'inline';" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" alt="" align="top">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">throws</span><span style="color: #000000;">&nbsp;ServletException,&nbsp;IOException&nbsp;</span><span id="Codehighlighter1_536_774_Closed_Text" style="border: 1px solid #808080; display: none; background-color: #ffffff;"><img src="http://www.blogjava.net/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_536_774_Open_Text"><span style="color: #000000;">{<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;App&nbsp;app&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;App();<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;str&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;app.getStr(</span><span style="color: #000000;">"</span><span style="color: #000000;">CE&nbsp;Maven&nbsp;Demo</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PrintWriter&nbsp;out&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;response.getWriter();<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out.print(</span><span style="color: #000000;">"</span><span style="color: #000000;">&lt;html&gt;&lt;body&gt;</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out.print(</span><span style="color: #000000;">"</span><span style="color: #000000;">&lt;h1&gt;</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;str);<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out.print(</span><span style="color: #000000;">"</span><span style="color: #000000;">&lt;/body&gt;&lt;/html&gt;</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000;"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif" alt="" align="top" />}</span></span></div>
<strong>5.4 POM文件</strong><br />
&nbsp;&nbsp;&nbsp; 大家可以发现，在前面新建工程时，我们并没有提到各个工程中的pom.xml文件。现在将要讨论这个问题。我们先看看app工程中的POM文件，其完整内容如下：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" alt="" align="top" /><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">project</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">modelVersion</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">4.0.0</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">modelVersion</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">groupId</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">ce.demo.mvn</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">groupId</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">artifactId</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">app</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">artifactId</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">packaging</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">jar</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">packaging</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">version</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">1.0</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">version</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">name</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">CE&nbsp;Maven&nbsp;Demo&nbsp;--&nbsp;App</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">name</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" alt="" align="top" /></span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">project</span><span style="color: #0000ff;">&gt;</span></div>
&nbsp;&nbsp;&nbsp; 大家可以发现此我帖出来的内容与实际由archetype插件生成的POM文件的内容有些不同，但基本上是一致的。只是为了使文件中的语句更清晰，此处删除了一些冗余的内容，并修改了该工程的version和name的值，以与此例子的背景来符合。在目前情况下modelVersion值将被固定为4.0.0，这也是Maven2唯一能够识别的model版本。groupId，artifactId的值与创建工程时使用的命令中的相关属性值是一致的。packaging的值由工程的类型决定，如应用程序工程的packaging值为jar，Web应用工程的packaging值为war。上述情况也可以从webapp的POM文件中看出，下面将看看这个pom的完整内容。<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" alt="" align="top" /><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">project</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">modelVersion</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">4.0.0</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">modelVersion</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">groupId</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">ce.demo.mvn</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">groupId</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">artifactId</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">webapp</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">artifactId</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">packaging</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">war</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">packaging</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">version</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">1.0</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">version</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">name</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">CE&nbsp;Maven&nbsp;Demo&nbsp;--&nbsp;WebApp</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">name</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">dependencies</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">dependency</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">groupId</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">ce.demo.mvn</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">groupId</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">artifactId</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">app</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">artifactId</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">version</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">1.0</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">version</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">dependency</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">dependency</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">groupId</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">javax.servlet</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">groupId</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">artifactId</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">servlet-api</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">artifactId</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">version</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">2.4</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">version</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">scope</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">provided</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">scope</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">dependency</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">&nbsp;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">dependencies</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" alt="" align="top" /></span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">project</span><span style="color: #0000ff;">&gt;</span></div>
&nbsp;&nbsp;&nbsp; 比较app与webapp中的POM，除前面已经提过的packaging的差别外，我们还可以发现webapp中的POM多了dependencies项。由于webapp需要用到app工程中的类(见HelloServlet源代码)，它还需要javax.servlet包(因为该包并不默认存在于jsdk中)。故，我们必须要将它们声明到依赖关系中。<br />
<strong>5.5 执行</strong><br />
&nbsp;&nbsp;&nbsp; 上述两个工程创建完毕后，就需要执行一些命令来看看会有什么结果出现。我们首先进入app目录，并执行命令<font color="#0000ff">mvn compile</font>，然后会在该目录下发现新生成的目录target\classes，即编译后的class文件(包括它的包目录)就放在了这里。再执行命令mvn package，在目录target中就会生成app-1.0.jar文件。该文件的全名由如下形式确定：<strong>artifactId-version.packaging</strong>。根据第2章的叙述可以知道，执行命令<font color="#0000ff">mvn package</font>时，将首先将产生执行命令<font color="#0000ff">mvn compile</font>之后的结果，故如果要打包，那么只需要执行<font color="#0000ff">mvn package</font>即可。<br />
&nbsp;&nbsp;&nbsp; 在app工程中执行完之后，就需要进入webapp工程了。进入webapp目录，此次将只执行<font color="#0000ff">mvn package</font>命令(隐示地执行了compile过程)。此次命令的执行并不成功，会出现如下问题：<br />
<font color="#0000ff">
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #000000;">D:\maven\demo\webapp&gt;mvn&nbsp;package<br />
&#8230;&#8230;<br />
<strong>Downloading:&nbsp;http://repo1.maven.org/maven2/ce/demo/mvn/app/</strong></span><strong><span style="color: #000000;">1.0</span><span style="color: #000000;">/app-</span><span style="color: #000000;">1.0</span></strong><span style="color: #000000;"><strong>.pom</strong><br />
</span><span style="font-weight: bold; color: #800000;">[</span><span style="color: #800000;">INFO</span><span style="font-weight: bold; color: #800000;">]</span><span style="color: #000000;">&nbsp;------------------------------------------------------------------------<br />
</span><span style="font-weight: bold; color: #800000;">[</span><span style="color: #800000;">ERROR</span><span style="font-weight: bold; color: #800000;">]</span><span style="color: #000000;">&nbsp;BUILD&nbsp;ERROR<br />
</span><span style="font-weight: bold; color: #800000;">[</span><span style="color: #800000;">INFO</span><span style="font-weight: bold; color: #800000;">]</span><span style="color: #000000;">&nbsp;------------------------------------------------------------------------<br />
</span><span style="font-weight: bold; color: #800000;">[</span><span style="color: #800000;">INFO</span><span style="font-weight: bold; color: #800000;">]</span><span style="color: #000000;">&nbsp;Error&nbsp;building&nbsp;POM&nbsp;(may&nbsp;not&nbsp;be&nbsp;this&nbsp;project's&nbsp;POM).<br />
Project&nbsp;ID:&nbsp;ce.demo.mvn:app<br />
Reason:&nbsp;Error&nbsp;getting&nbsp;POM&nbsp;for&nbsp;'ce.demo.mvn:app'&nbsp;from&nbsp;the&nbsp;repository:&nbsp;Error&nbsp;transferring&nbsp;file<br />
&nbsp;&nbsp;ce.demo.mvn:app:pom:</span><span style="color: #000000;">1.0</span><span style="color: #000000;"><br />
from&nbsp;the&nbsp;specified&nbsp;remote&nbsp;repositories:<br />
&nbsp;&nbsp;central&nbsp;(http://repo1.maven.org/maven2)<br />
&#8230;&#8230;</span></div>
</font>&nbsp;&nbsp;&nbsp; 由粗体内容可知，Maven正试图从central仓库下载app工程的artifact，但central仓库肯定不会有这个artifact，其结果只能是执行失败!由第1章artifact名词的解释可知，被依赖的artifact必须存在于仓库(远程或本地)中，但目前webapp所依赖的app必不存在于仓库中，所以执行只能失败。<br />
&nbsp;&nbsp;&nbsp; 解决这个问题有两种方法：[1]将app-1.0.jar安装到仓库中，使它成为一个artifact；[2]构建一个更高层次的工程，使app和webapp成为这个工程的子工程，然后从这个更高层次工程中执行命令。<br />
&nbsp;&nbsp;&nbsp; 第一种方法比较简单（<font color="#0000ff"><font color="#000000">见</font>http://www.blogjava.net/jiangshachina/admin/EditPosts.aspx<font color="#000000">中的第一个主题</font></font>），此处将详细讨论第2种方法(见5.6节)。<br />
<strong>5.6 更高层次工程</strong><br />
&nbsp;&nbsp;&nbsp; 我们可以将app和webapp的上一级目录demo作为这两个工程的</font> <font size="2">一个</font> <font size="2">更高层次工程，即使用app和webapp成为这个工程的子工程。为了使demo目录成为一个demo工程，只需要在这个目录下添加一个pom.xml文件，该文件内容如下：<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; font-size: 13px; width: 98%; background-color: #eeeeee;"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" alt="" align="top" /><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">project</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">modelVersion</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">4.0.0</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">modelVersion</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">groupId</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">ce.demo</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">groupId</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">artifactId</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">mvn-demo</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">artifactId</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">packaging</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">pom</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">packaging</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">version</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">1.0</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">version</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">name</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">CE&nbsp;Maven&nbsp;Demo</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">name</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;<br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">modules</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">module</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">app</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">module</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;</span><span style="color: #800000;">module</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;">webapp</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">module</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">modules</span><span style="color: #0000ff;">&gt;</span><span style="color: #000000;"><br />
<img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" alt="" align="top" /></span><span style="color: #0000ff;">&lt;/</span><span style="color: #800000;">project</span><span style="color: #0000ff;">&gt;</span></div>
&nbsp;&nbsp;&nbsp; 与app和webapp中的POM相比，demo的POM使用了modules项，modules用于声明本工程的子工程，module中的值对应于子工程的artifact名。而且该POM的packaging类型必须为pom。<br />
&nbsp;&nbsp;&nbsp; 有了demo工程后，我们只需要在demo目录下执行相关命令就可以了。通过如下命令即可验证：<br />
&nbsp;&nbsp;&nbsp; [1]<font color="#0000ff">mvn clean</font> &#8211; 消除工程(包括所有子工程)中产生的所有输出。这本文的实例中，实际上是删除target目录。由于之前的操作只有app工程产生了target目录，而webapp并没有，所以将只会删除app工程中的target目录。<br />
&nbsp;&nbsp;&nbsp; [2]<font color="#0000ff">mvn package</font> &#8211; 将工程制作成相应的包，app工程是作成jar包(app-1.0.jar)，webapp工程是作成war包(webapp-1.0.war)。打开webapp-1.0.war包，可以发现app-1.0.jar被放到了WEB-INF的lib目录中。<br />
<font size="3"><strong>6 小结</strong></font><br />
&nbsp;&nbsp;&nbsp; 通过以上的叙述与实例，应该可以对Maven有一个粗略的认识了。使用Maven关键是要弄清楚如何写pom.xml文件，就如同使用Ant要会写build.xml文件一样。在POM中可以直接写入Ant的task脚本，也可以调用Ant的build.xml文件(推荐)，所以Maven也可以完成Ant的绝大多数工作(但不必安装Ant)。注意：<strong>使用Maven就不要再过多的使用Ant脚本</strong>。<br />
&nbsp;&nbsp;&nbsp; 利用好Maven的继承特性及子工程的关系，可以很好地简化POM文件，并能够构建层次结构良好的工程，有利于工程的维护。<br />
<font size="3"><strong>7 参考资源</strong></font><br />
[1]Maven官方网站. http://maven.apache.org<br />
[2]Maven POM文件参考结构. http://maven.apache.org/ref/current/maven-model/maven.html<br />
[3]Super POM. http://maven.apache.org/guides/introduction/introduction-to-the-pom.html<br />
[4]Maven主要插件的列表. http://maven.apache.org/plugins<br />
[5]Maven基本使用指南. http://maven.apache.org/guides/index.html<br />
[6]Better Build with Maven. http://www.mergere.com/m2book_download.jsp -- 强烈推荐<br />
[7]介绍Maven2. http://www.javaworld.com/javaworld/jw-12-2005 /jw-1205-maven_p.html<br />
[8]揭秘Maven2 POM. http://www.javaworld.com/javaworld/jw-05-2006/jw-0529-maven.html<br />
[9]Maven让事情变得简单. http://www-128.ibm.com/developerworks/cn/java/j-maven<br />
[10]Maven文档集. http://docs.codehaus.org/display/MAVENUSER/Home<br />
[11]有效利用Maven2的站点生成功能. http://www.matrix.org.cn/resource/article/44/44491_Maven2.html<br />
<font size="3"><strong>文中例子程序下载：<a href="http://www.blogjava.net/files/jiangshachina/maven.rar">http://www.blogjava.net/files/jiangshachina/maven.rar</a></strong></font><br />
</font><br />
<font size="2">请关注本人的另一篇关于Maven的文章--<a href="http://www.blogjava.net/jiangshachina/archive/2006/12/12/79093.html">Maven入门--较复杂的实例</a></font><img src ="http://www.blogjava.net/jiangshachina/aggbug/67080.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jiangshachina/" target="_blank">Sha Jiang</a> 2006-09-01 13:43 <a href="http://www.blogjava.net/jiangshachina/archive/2006/09/01/67080.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>