﻿<?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-代码工-文章分类-appfuse2 and maven2 </title><link>http://www.blogjava.net/jianyue/category/34500.html</link><description>砌代码</description><language>zh-cn</language><lastBuildDate>Tue, 16 Sep 2008 23:15:18 GMT</lastBuildDate><pubDate>Tue, 16 Sep 2008 23:15:18 GMT</pubDate><ttl>60</ttl><item><title>maven pom.xml详解</title><link>http://www.blogjava.net/jianyue/articles/227932.html</link><dc:creator>Qzi</dc:creator><author>Qzi</author><pubDate>Tue, 16 Sep 2008 08:21:00 GMT</pubDate><guid>http://www.blogjava.net/jianyue/articles/227932.html</guid><wfw:comment>http://www.blogjava.net/jianyue/comments/227932.html</wfw:comment><comments>http://www.blogjava.net/jianyue/articles/227932.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jianyue/comments/commentRss/227932.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jianyue/services/trackbacks/227932.html</trackback:ping><description><![CDATA[<pre>&lt;project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/maven-v4_0_0.xsd"&gt;
&lt;modelVersion&gt;4.0.0&lt;/modelVersion&gt;&lt;!--maven2.0必须是这样写，现在是maven2唯一支持的版本--&gt;
&lt;!-- The Basics --&gt;
<span style="font-size: 18pt"><strong>&lt;groupId&gt;...&lt;/groupId&gt;</strong></span> &lt;!--指定组名,例如：org.apache.maven--&gt;
<span style="font-size: 18pt"><strong>&lt;artifactId&gt;...&lt;/artifactId&gt;</strong></span> &lt;!--指定工程名例如：appfuse--&gt;
<strong style="font-size: 18pt">&lt;version&gt;...&lt;/version&gt;</strong> &lt;!--指定版本号
<strong style="font-size: 18pt">&lt;packaging&gt;...&lt;/packaging&gt;</strong> &lt;!--The current core packaging values are: <tt>pom</tt>, <tt>jar</tt>, <tt>maven-plugin</tt>, <tt>ejb</tt>, <tt>war</tt>, <tt>ear</tt>, <tt>rar</tt>, <tt>par</tt>--&gt;
<strong style="font-size: 18pt">&lt;classifier&gt;...&lt;/classifier&gt;</strong> &lt;!--projects are displayed as <tt>groupId:artifactId:packaging:classifier:version</tt>--&gt;<br />
<strong style="font-size: 18pt">&lt;name&gt;...&lt;/name&gt;</strong> &lt;!--一些无关太重要的东西，用户描述你的项目的名字,可选的--&gt;<br />
<strong style="font-size: 18pt">&lt;url&gt;...&lt;/url&gt;</strong> &lt;!--暂时不知何物，貌似无关重要，只是写明开发团队的网站，可选的--&gt;</pre>
<pre>&lt;!--
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img id="Code_Closed_Image_143204" onclick="this.style.display='none'; Code_Closed_Text_143204.style.display='none'; Code_Open_Image_143204.style.display='inline'; Code_Open_Text_143204.style.display='inline';" height="16" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" width="11" align="top" /><img id="Code_Open_Image_143204" style="display: none" onclick="this.style.display='none'; Code_Open_Text_143204.style.display='none'; Code_Closed_Image_143204.style.display='inline'; Code_Closed_Text_143204.style.display='inline';" height="16" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" width="11" align="top" /><span id="Code_Open_Text_143204" style="display: none"><br />
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080">&nbsp;1</span><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">prerequisites</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;2</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">maven</span><span style="color: #0000ff">&gt;</span><span style="color: #000000">2.0.6</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">maven</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;3</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">prerequisites</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;4</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
</span><span style="color: #008080">&nbsp;5</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">licenses</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;6</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">license</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;7</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">name</span><span style="color: #0000ff">&gt;&lt;/</span><span style="color: #800000">name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;8</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">url</span><span style="color: #0000ff">&gt;&lt;/</span><span style="color: #800000">url</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">&nbsp;9</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">license</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">10</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">licenses</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">11</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
</span><span style="color: #008080">12</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&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 />
</span><span style="color: #008080">13</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">connection</span><span style="color: #0000ff">&gt;&lt;/</span><span style="color: #800000">connection</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">14</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">developerConnection</span><span style="color: #0000ff">&gt;&lt;/</span><span style="color: #800000">developerConnection</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">15</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">url</span><span style="color: #0000ff">&gt;&lt;/</span><span style="color: #800000">url</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">16</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&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 />
</span><span style="color: #008080">17</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
</span><span style="color: #008080">18</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">issueManagement</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">19</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">system</span><span style="color: #0000ff">&gt;&lt;/</span><span style="color: #800000">system</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">20</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">url</span><span style="color: #0000ff">&gt;&lt;/</span><span style="color: #800000">url</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">21</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">issueManagement</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">22</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><br />
</span><span style="color: #008080">23</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">developers</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">24</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">developer</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">25</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">id</span><span style="color: #0000ff">&gt;&lt;/</span><span style="color: #800000">id</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">26</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">name</span><span style="color: #0000ff">&gt;&lt;/</span><span style="color: #800000">name</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">27</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">email</span><span style="color: #0000ff">&gt;&lt;/</span><span style="color: #800000">email</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">28</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">timezone</span><span style="color: #0000ff">&gt;&lt;/</span><span style="color: #800000">timezone</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">29</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">developer</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br />
</span><span style="color: #008080">30</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">developers</span><span style="color: #0000ff">&gt;</span></span></div>
这里有些东西暂时不谈--&gt;</pre>
<pre><strong style="font-size: 18pt">&lt;dependencies&gt;...&lt;/dependencies&gt;</strong> &lt;!--例子：&nbsp;&nbsp;&nbsp; &lt;dependency&gt;<br />
</pre>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;groupId&gt;junit&lt;/groupId&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;artifactId&gt;junit&lt;/artifactId&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;version&gt;4.0&lt;/version&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;type&gt;jar&lt;/type&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;scope&gt;test&lt;/scope&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;optional&gt;true&lt;/optional&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/dependency&gt;<br />
<span style="font-size: 14pt"><strong>groupId，artifactId和version</strong></span>这个三组合标示依赖的具体工程，而且这个依赖工程必须是maven中心包管理范围内的。如果碰上非开源包，maven支持不了这个包，那么则有三种方法处理：1.本地安装这个插件install plugin例如：
<pre>mvn install:install-file -Dfile=non-maven-proj.jar -DgroupId=some.group -DartifactId=non-maven-proj -Dversion=1
</pre>
<p>2.创建自己的Repositories并且部署这个包，使用类似上面的<tt>deploy:deploy-file</tt> 命令3.设置scope为system，并且指定系统路径</p>
<p><strong style="font-size: 14pt">dependency里面的classifier</strong>，用于区分从同一个pom编译出来的但是内容不同的同名包，例如同一个工程编译出两个artifact，一个支持jdk1.5一个支持jdk1.4，那么就可以使用这个来命名为jdk15和jdk14来区分，它如果出现在包名中，那么它必须跟在版本号后。还有一种情况是将一个工程的一些次要artifact附到主要artifact中，就可以使用这个来区分，例如一个工程产生source，javadoc，class三种东西，那么就可以使用不同的classifier来分别标识这些东西 <br />
<strong style="font-size: 14pt">dependency里面的type</strong>，默认为jar，类型，常用如：jar，ejb-client，test-jar，可以设置plugins中的extensions值为true后在增加新类型<br />
<strong style="font-size: 14pt">dependency里面的scope</strong>，指定classpath，可以为：compile（默认的，compile scope在所有classpaths内有效，这些dependencies将会传播到项目中。provided：指示jdk或者某个容器可以提供他，它只在compilation和test的classpaths有效，而且不会传播的。runtime：指示这个dependency在编译过程是不必要的，但是执行需要，在test和runtime的classpaths有效，在compile的classpaths无效。test：指示这个dependency在一般程序运行是无效的，但是在test的compilation和execution是有效的，system则跟provided类似，但是这种dependency必须人工明确地制定。这种依赖不会在repository中查找。<br />
<strong style="font-size: 14pt">dependency里面的systemPath</strong>：只在dependency的scope声明为system的时候才有用除，否则，build的过程将会失败。路径必须是绝对的，所以最好使用property来声明机器的特定路径。<br />
<span style="font-size: 14pt"><strong>dependency里面的optional</strong></span>：如果工程本身是一个dependency那么就标记为optional，例如X需要A，A需要B，那么X只需要optional的B，则B在X中就是optional声明的了<br />
<strong style="font-size: 14pt">dependency里面的exclusions</strong>：如果X需要A，A包含B依赖，那么X可以声明不要B依赖，只要在exclusions中声明exclusion。optional是不会install或者使用B，而exclusion是将B从依赖树中是删除。例如appfuse不想使用hibernate，但是appfuse是集成hibernate的，所以就排除掉：<br />
&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; &lt;exclusion&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;groupId&gt;org.appfuse&lt;/groupId&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;artifactId&gt;appfuse-hibernate&lt;/artifactId&gt;<br />
&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; &lt;/exclusions&gt;--&gt;<br />
<br />
&lt;!--Inheritance：如果一个工程是pareent或者aggregation（即mutil-module的）的，那么必须在packaging赋值pom。child工程从parent继承的包括：dependencies，developers and contributors，plugin lists，reports lists，plugin execution with matching ids，plugin configuration--&gt;<br />
<strong style="font-size: 18pt">&lt;parent&gt;...&lt;/parent&gt;</strong> &lt;!--参照下面例子：relativePath是可选的，maven会首先搜索这个地址，在搜索本地和远程repositories之前<br />
&nbsp; &lt;parent&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;groupId&gt;org.codehaus.mojo&lt;/groupId&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;artifactId&gt;my-parent&lt;/artifactId&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;version&gt;2.0&lt;/version&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;relativePath&gt;../my-parent&lt;/relativePath&gt;<br />
&nbsp; &lt;/parent&gt;<br />
--&gt;<br />
<strong style="font-size: 18pt">&nbsp;&lt;dependencyManagement&gt;...&lt;/dependencyManagement&gt;</strong>&nbsp; &lt;!--用于帮助管理children的dependencies。例如如果parent使用dependencyManagement定义一个dependencyon junit:junit:4.0，那么它的children就可以只引用groupId和artifactId，而version就可以通过parent来设置。好处就是集中管理依赖详情--&gt;<br />
&lt;modules&gt;...&lt;/modules&gt;&lt;!--对于多模块project，outer-module没有必要考虑inner-module的dependencies，当列出modules的时候。modules的顺序是不重要的，因为maven会自动根据依赖关系来拓扑排序，modules例子：<br />
&nbsp;&nbsp;&nbsp; &lt;module&gt;my-project&lt;module&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;module&gt;another-project&lt;module&gt;<br />
--&gt;<br />
&lt;properties&gt;...&lt;/properties&gt; &lt;!--参照<a href="http://www.blogjava.net/jianyue/articles/maven2_setting.html">http://www.blogjava.net/jianyue/articles/maven2_setting.html</a>，是一样的--&gt;<br />
<strong style="font-size: 14pt">&lt;!-- Build Settings --&gt;&lt;build&gt;...&lt;/build&gt;</strong> &lt;!--<br />
<span style="font-size: 14pt"><strong><span style="font-size: 14pt"><strong style="font-size: 12pt">defaultGoal</strong></span>：</strong></span>默认的目标，必须跟命令行上的参数相同例如jar:jar，或者与时期（parse）相同，例如install<br />
<strong style="font-size: 14pt"><span style="font-size: 12pt"><strong>directory</strong></span>：</strong>指定build target目标的目录，默认为${basedir}/target，即项目根目录下的target<br />
<strong style="font-size: 14pt"><span style="font-size: 12pt"><strong>finalName</strong></span>：</strong>指定去掉后缀名后的工程名字，例如：默认为<tt>${artifactId}-${version}<br />
</tt><strong style="font-size: 12pt">filters：</strong>用于定义指定filter属性文件位置，例如filter元素赋值filters/filter1.properties，那么这个文件里面就可以定义name=value对，这个name=value对的值就可以在工程pom中通过${name}引用，默认的filter目录是<tt>${basedir}/src/main/filters/</tt><br />
<strong style="font-size: 14pt"><span style="font-size: 12pt"><strong>resources</strong></span>：</strong>描述工程中资源的位置<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;resource&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;targetPath&gt;META-INF/plexus&lt;/targetPath&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;filtering&gt;false&lt;/filtering&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;directory&gt;${basedir}/src/main/plexus&lt;/directory&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;includes&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;include&gt;configuration.xml&lt;/include&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/includes&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;excludes&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;exclude&gt;**/*.properties&lt;/exclude&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/excludes&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/resource&gt;<br />
targetPath：指定build资源到哪个目的目录，默认是base directory<br />
filtering：指定是否将filter文件（即上面说的filters里定义的*.property文件）的变量值在这个resource文件有效，例如上面就指定那些变量值在configuration文件无效<br />
directory：指定属性文件的目录，build的过程需要找到它，并且将其放到targetPath下。默认的directory是<tt>${basedir}/src/main/resources</tt><br />
includes：指定包含文件的patterns，符合样式并且在directory目录下的文件将会是包含进project的资源文件<br />
excludes：指定不包含在内的patterns，如果includes与excludes有冲突，那么excludes胜利，那些符合冲突样式的文件还是不会包含进来的<br />
<strong style="font-size: 12pt"><span style="font-size: 14pt"><strong style="font-size: 12pt">testResources</strong></span>：</strong>这个模块包含测试资源元素，其内容定义与resources类似。不同的一点是默认的测试资源路径是${basefir}/src/test/resources，测试资源是不部署的。<br />
--&gt;<br />
<span style="font-size: 12pt"><strong>&lt;plugins&gt;...&lt;/plugins&gt;</strong></span> &lt;!--<br />
&lt;plugin&gt;<br />
&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; &lt;artifactId&gt;maven-jar-plugin&lt;/artifactId&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;version&gt;2.0&lt;/version&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;extensions&gt;false&lt;/extensions&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;inherited&gt;true&lt;/inherited&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;configuration&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;classifier&gt;test&lt;/classifier&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/configuration&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;dependencies&gt;...&lt;/dependencies&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;executions&gt;...&lt;/executions&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/plugin&gt;<br />
<br />
extensions：true or false，决定是否要load这个plugin的extensions<br />
inherited：是否让子pom继承true or false<br />
configuration：通常用于私有不开源的plugin，不能够详细了解plugin的内部工作原理，但使plugin满足需要满足的properties<br />
dependencies：与pom基础的dependencies的结构和功能都相同，只是plugin的dependencies用于plugin，而pom的dependencies用于本身这个工程，在plugin的dependencies主要用于改变plugin原来的dependencies，例如排除一些用不到的dependency或者修改dependency的版本等，详细请看pom基础的dependencies<br />
executions：plugin也有很多个目标，每个目标具有不同的配置，executions就是设定plugin的目标<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;execution&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;id&gt;echodir&lt;/id&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;goals&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;goal&gt;run&lt;/goal&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/goals&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;phase&gt;verify&lt;/phase&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;inherited&gt;false&lt;/inherited&gt;<br />
&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; &lt;tasks&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;echo&gt;Build Dir: ${project.build.directory}&lt;/echo&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/tasks&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/configuration&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/execution&gt;<br />
id：标识符<br />
goals：里面列出一系列的goal元素，例如上面的run goal<br />
phase：声明goals执行的时期，例如：verify<br />
inherited：是否传递execution到子pom<br />
configuration：设置execution下列表的goals 的设置，而不是plugin所有goals的设置<br />
<span style="font-size: 12pt"><strong>plugin Management:</strong> 用于管理plugin，与pom build里的plugins区别是，这里的plugin是列出来，然后让子pom来决定是否引用的，例如后面的引用方法。<br />
&lt;pluginManagement&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;plugins&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;plugin&gt;<br />
&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; &lt;artifactId&gt;maven-jar-plugin&lt;/artifactId&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;version&gt;2.2&lt;/version&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;executions&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;execution&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;id&gt;pre-process-classes&lt;/id&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;phase&gt;compile&lt;/phase&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;goals&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;goal&gt;jar&lt;/goal&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/goals&gt;<br />
&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; &lt;classifier&gt;pre-process&lt;/classifier&gt;<br />
&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;/execution&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/executions&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/plugin&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/plugins&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/pluginManagement&gt;<br />
子pom引用方法：<br />
在pom的build里的plugins引用：<br />
&nbsp;&nbsp;&nbsp; &lt;plugins&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;plugin&gt;<br />
&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; &lt;artifactId&gt;maven-jar-plugin&lt;/artifactId&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/plugin&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/plugins&gt;<br />
<strong>build 里面的</strong><a name="Directories"><strong>Directories</strong></a><strong>：</strong><br />
&nbsp;&nbsp;&nbsp; &lt;sourceDirectory&gt;${basedir}/src/main/java&lt;/sourceDirectory&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;scriptSourceDirectory&gt;${basedir}/src/main/scripts&lt;/scriptSourceDirectory&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;testSourceDirectory&gt;${basedir}/src/test/java&lt;/testSourceDirectory&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;outputDirectory&gt;${basedir}/target/classes&lt;/outputDirectory&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;testOutputDirectory&gt;${basedir}/target/test-classes&lt;/testOutputDirectory&gt;<br />
这几个元素只在parent bulid element里面定义，他们设置多种路径结构，他们并不在profile里，所以不能通过profile来修改<br />
<strong>build 里面的</strong><a name="Extensions"><strong>Extensions</strong></a><strong>：<br />
</strong>它们是一系列build过程中要使用的产品，他们会包含在running bulid&#8216;s classpath里面。他们可以开启extensions，也可以通过提供条件来激活plugins。简单来讲，extensions是在build过程被激活的产品<br />
&nbsp;&nbsp;&nbsp; &lt;extensions&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;extension&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;groupId&gt;org.apache.maven.wagon&lt;/groupId&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;artifactId&gt;wagon-ftp&lt;/artifactId&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;version&gt;1.0-alpha-3&lt;/version&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/extension&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/extensions&gt;<br />
</span>--&gt;<br />
<span style="font-size: 18pt"><strong>&nbsp;&lt;reporting&gt;...&lt;/reporting&gt;</strong></span> &lt;!--<br />
reporting包含site生成阶段的一些元素，某些maven&nbsp; plugin可以生成reports并且在repoting下配置。例如javadoc，maven site等，在reporting下配置reprot plugin的方法与build几乎一样，最不同的是：build的plug-in goals在executions下设置，而reporting的configures goals在reportset。更微妙的不同是reporting下的plugin configuration works as a build plugin configuration，但是相反是不对的（即build plugin configuration does not affect a reporting plugin）。<br />
<strong>excludeDefaults：</strong>是否排除site generator默认产生的reports<br />
<strong>outpoutDirectory</strong>，默认的dir变成：<tt>${basedir}/target/site</tt> <br />
<strong>Report sets：</strong>设置execution goals，相当于build里面的executions。不同的是不能够bind a report to another phase，只能够是site<br />
&lt;reporting&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;plugins&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;plugin&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ...<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;reportSets&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;reportSet&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;id&gt;sunlink&lt;/id&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;reports&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;report&gt;javadoc&lt;/report&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/reports&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;inherited&gt;true&lt;/inherited&gt;<br />
&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; &lt;links&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;link&gt;http://java.sun.com/j2se/1.5.0/docs/api/&lt;/link&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/links&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/configuration&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/reportSet&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/reportSets&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/plugin&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/plugins&gt;<br />
&nbsp; &lt;/reporting&gt;<br />
reporting里面的厄reportSets和build里面的executions的作用都是控制pom的不同粒度去控制build的过程，我们不单要配置plugins，还要配置那些plugins单独的goals。<br />
--&gt;<br />
<span style="font-size: 18pt"><strong>&lt;!-- More Project Information --&gt;</strong></span><br />
<span style="font-size: 18pt"><strong>&lt;description&gt;...&lt;/description&gt; <br />
</strong></span>project的描述<br />
<span style="font-size: 18pt"><strong>&lt;inceptionYear&gt;...&lt;/inceptionYear&gt;</strong> <br />
</span>工程的初始时间<br />
<span style="font-size: 18pt"><strong>&lt;licenses&gt;...&lt;/licenses&gt;<br />
</strong></span>&lt;licenses&gt;<br />
&nbsp; &lt;license&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;name&gt;Apache 2&lt;/name&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;url&gt;http://www.apache.org/licenses/LICENSE-2.0.txt&lt;/url&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;distribution&gt;repo&lt;/distribution&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;comments&gt;A business-friendly OSS license&lt;/comments&gt;<br />
&nbsp; &lt;/license&gt;<br />
&lt;/licenses&gt;<br />
&lt;!--列出本工程直接的licenses，而不要列出dependencies的licenses，</p>
<li>name, url and comments: are self explanatory, and have been encountered before in other capacities. The fourth license element is:
<li>distribution: This describes how the project may be legally distributed. The two stated methods are repo (they may be downloaded from a Maven repository) or manual (they must be manually installed).
<p>--&gt;<br />
<span style="font-size: 18pt"><strong>&lt;organization&gt;...&lt;/organization&gt;<br />
<span style="font-size: 12pt">&lt;!--<br />
</span></strong></span>&nbsp;&nbsp; &lt;organization&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;name&gt;Codehaus Mojo&lt;/name&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;url&gt;http://mojo.codehaus.org&lt;/url&gt;<br />
&nbsp; &lt;/organization&gt;<br />
很多工程都受到某些组织运行，这里设置基本信息<br />
--&gt;<br />
<span style="font-size: 18pt"><strong>&lt;developers&gt;...&lt;/developers&gt;</strong></span><br />
&lt;!--例如：一个开发者可以有多个roles，properties是<br />
&nbsp; &lt;developers&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;developer&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;id&gt;eric&lt;/id&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;name&gt;Eric&lt;/name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;email&gt;eredmond@codehaus.org&lt;/email&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;url&gt;http://eric.propellors.net&lt;/url&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;organization&gt;Codehaus&lt;/organization&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;organizationUrl&gt;http://mojo.codehaus.org&lt;/organizationUrl&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;roles&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;role&gt;architect&lt;/role&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;role&gt;developer&lt;/role&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/roles&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;timezone&gt;-6&lt;/timezone&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;properties&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;picUrl&gt;http://tinyurl.com/prv4t&lt;/picUrl&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/properties&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/developer&gt;<br />
&nbsp; &lt;/developers&gt;<br />
--&gt;<br />
<strong style="font-size: 18pt">&lt;contributors&gt;...&lt;/contributors&gt;<br />
</strong>&lt;!--跟developer差不多，只是contributors是副的工作人员，不过良好工程应该需要更多的contributors而不是developer，例如：<br />
&nbsp; &lt;contributors&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;contributor&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;name&gt;Noelle&lt;/name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;email&gt;some.name@gmail.com&lt;/email&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;url&gt;http://noellemarie.com&lt;/url&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;organization&gt;Noelle Marie&lt;/organization&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;organizationUrl&gt;http://noellemarie.com&lt;/organizationUrl&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;roles&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;role&gt;tester&lt;/role&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/roles&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;timezone&gt;-5&lt;/timezone&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;properties&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;gtalk&gt;some.name@gmail.com&lt;/gtalk&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/properties&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/contributor&gt;<br />
&nbsp; &lt;/contributors&gt;<br />
--&gt;<br />
<strong style="font-size: 18pt">&lt;!-- Environment Settings --&gt; &lt;issueManagement&gt;...&lt;/issueManagement&gt;</strong><br />
&nbsp;&lt;!--定义defect tracking system缺陷跟踪系统，比如有（bugzilla,testtrack,clearquest等），例如：<br />
&nbsp; &lt;issueManagement&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;system&gt;Bugzilla&lt;/system&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;url&gt;http://127.0.0.1/bugzilla/&lt;/url&gt;<br />
&nbsp; &lt;/issueManagement&gt;<br />
--&gt;<br />
<strong style="font-size: 18pt">&lt;ciManagement&gt;...&lt;/ciManagement&gt; <br />
</strong>&lt;!--<a name="Continuous_Integration_Management">Continuous Integration Management</a>：设置自动build系统，一些集成程序包括continuum,Cruise control等。例如：</p>
<p>&lt;ciManagement&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;system&gt;continuum&lt;/system&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;url&gt;http://127.0.0.1:8080/continuum&lt;/url&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;notifiers&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;notifier&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;type&gt;mail&lt;/type&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;sendOnError&gt;true&lt;/sendOnError&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;sendOnFailure&gt;true&lt;/sendOnFailure&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;sendOnSuccess&gt;false&lt;/sendOnSuccess&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;sendOnWarning&gt;false&lt;/sendOnWarning&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;configuration&gt;&lt;address&gt;continuum@127.0.0.1&lt;/address&gt;&lt;/configuration&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/notifier&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/notifiers&gt;<br />
&nbsp; &lt;/ciManagement&gt;</p>
<p>maven捕获一些经常重发生的配置，在notifier元素里配置。A notifier is the manner in which people are notified of certain build statuses. In the following example, this POM is setting a notifier of type <tt>mail</tt> (meaning email), and configuring the email address to use on the specified triggers <tt>sendOnError</tt>, <tt>sendOnFailure</tt>, and not <tt>sendOnSuccess</tt> or <tt>sendOnWarning</tt>.<br />
--&gt;<br />
<strong style="font-size: 18pt">&lt;mailingLists&gt;...&lt;/mailingLists&gt;<br />
</strong>&lt;!--例如：<br />
&nbsp; &lt;mailingLists&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;mailingList&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;name&gt;User List&lt;/name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;subscribe&gt;user-subscribe@127.0.0.1&lt;/subscribe&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;unsubscribe&gt;user-unsubscribe@127.0.0.1&lt;/unsubscribe&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;post&gt;user@127.0.0.1&lt;/post&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;archive&gt;http://127.0.0.1/user/&lt;/archive&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;otherArchives&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;otherArchive&gt;http://base.google.com/base/1/127.0.0.1&lt;/otherArchive&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/otherArchives&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/mailingList&gt;<br />
&nbsp; &lt;/mailingLists&gt;<br />
看不懂解释啊，照搬吧：</p>
<li><strong>subscribe</strong>, <strong>unsubscribe</strong>: There elements specify the email addresses which are used for performing the relative actions To subscribe to the user list above, a user would send an email to user-subscribe@127.0.0.1.
<li><strong>archive</strong>: This element specifies the url of the archive of old mailing list emails, if one exists. If there are mirrored archives, they can be specified under otherArchives.
<li><strong>post</strong>: The email address which one would use in order to post to the mailing list. Note that not all mailing lists have the ability to post to (such as a build failure list). <br />
--&gt;<br />
<strong style="font-size: 18pt">&lt;scm&gt;...&lt;/scm&gt;</strong>
<p>&lt;!--例如：<br />
&nbsp; &lt;scm&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;connection&gt;scm:svn:http://127.0.0.1/svn/my-project&lt;/connection&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;developerConnection&gt;scm:svn:https://127.0.0.1/svn/my-project&lt;/developerConnection&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;tag&gt;HEAD&lt;/tag&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;url&gt;http://127.0.0.1/websvn/my-project&lt;/url&gt;<br />
&nbsp; &lt;/scm&gt;<br />
<strong>connection, developerConnection:</strong> 都是连接字符串，其中后者是具有write权限的scm连接，常用的scm工具包括cvs与subversion，还有其他<a href="http://maven.apache.org/scm/scms-overview.html">scms</a>，url的字符串格式是：scm:[provider]:[provider_specific]，例如cvs的是scm:cvs:pserver:127.0.0.1:/cvs/root:my-project<br />
<strong>tag</strong>：说明project所在的目录tag，默认是HEAD，表示根目录<br />
<strong>url</strong>：公开的可浏览repository<br />
--&gt;</p>
<p><strong style="font-size: 18pt">&lt;prerequisites&gt;...&lt;/prerequisites&gt;</strong><br />
&nbsp;&lt;!--首要条件，如果不满足，maven会在事件开始之前失败，在pom4.0，唯一的首要条件是maven元素--&gt;<br />
<span style="font-size: 18pt"><strong>&lt;repositories&gt;...&lt;/repositories&gt;</strong></span><br />
&lt;!--要成为maven2的repository artifact，必须具有pom文件在<tt>$BASE_REPO/groupId/artifactId/version/artifactId-version.pom<br />
</tt><font face="Courier New">BASE_REPO可以是本地，也可以是远程的。repository元素就是声明那些去查找的repositories<br />
</font>默认的central Maven repository在<a class="externalLink" href="http://repo1.maven.org/maven2/">http://repo1.maven.org/maven2/</a>；<br />
&lt;repositories&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;repository&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;releases&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;enabled&gt;false&lt;/enabled&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;updatePolicy&gt;always&lt;/updatePolicy&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;checksumPolicy&gt;warn&lt;/checksumPolicy&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/releases&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;snapshots&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;enabled&gt;true&lt;/enabled&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;updatePolicy&gt;never&lt;/updatePolicy&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;checksumPolicy&gt;fail&lt;/checksumPolicy&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/snapshots&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;id&gt;codehausSnapshots&lt;/id&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;name&gt;Codehaus Snapshots&lt;/name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;url&gt;http://snapshots.maven.codehaus.org/maven2&lt;/url&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;layout&gt;default&lt;/layout&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/repository&gt;<br />
&nbsp; &lt;/repositories&gt;<br />
<strong>release和snapshots</strong>：是artifact的两种policies，pom可以选择那种政策有效。<br />
<strong>enable</strong>：本别指定两种类型是否可用，true or false<br />
<strong>updatePolicy</strong>:说明更新发生的频率always 或者 never 或者 daily（默认的）或者 interval:X（X是分钟数）<br />
<strong>checksumPolicy</strong>：When Maven deploys files to the repository, it also deploys corresponding checksum files. Your options are to <tt>ignore</tt>, <tt>fail</tt>, or <tt>warn</tt> on missing or incorrect checksums.<br />
<strong>layout：</strong>maven1.x与maven2有不同的layout，所以可以声明为default或者是legacy（遗留方式maven1.x）。<br />
--&gt;<br />
<strong style="font-size: 18pt">&nbsp;&lt;pluginRepositories&gt;...&lt;/pluginRepositories&gt;<br />
</strong>&lt;!--与Repositories具有类似的结构，只是Repositories是dependencies的home，而这个是plugins 的home。--&gt;<br />
<span style="font-size: 18pt"><strong>&lt;distributionManagement&gt;...&lt;/distributionManagement&gt;</strong></span><br />
&lt;!--管理distribution和supporting files。<br />
<strong>downloadUrl</strong>：是其他项目为了抓取本项目的pom&#8217;s artifact而指定的url，就是说告诉pom upload的地址也就是别人可以下载的地址。<br />
<strong>status</strong>：这里的状态不要受到我们的设置，maven会自动设置project的状态，有效的值：none：没有声明状态，pom默认的；converted：本project是管理员从原先的maven版本convert到maven2的；partner：以前叫做synched，意思是与partner repository已经进行了同步；deployed：至今为止最经常的状态，意思是制品是从maven2 instance部署的，人工在命令行deploy的就会得到这个；verified：本制品已经经过验证，也就是已经定下来了最终版。<br />
<strong>repository</strong>：声明deploy过程中current project会如何变成repository，说明部署到repository的信息。<br />
&nbsp;&nbsp;&nbsp; &lt;repository&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;uniqueVersion&gt;false&lt;/uniqueVersion&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;id&gt;corp1&lt;/id&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;name&gt;Corporate Repository&lt;/name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;url&gt;scp://repo1/maven2&lt;/url&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;layout&gt;default&lt;/layout&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/repository&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;snapshotRepository&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;uniqueVersion&gt;true&lt;/uniqueVersion&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;id&gt;propSnap&lt;/id&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;name&gt;Propellors Snapshots&lt;/name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;url&gt;sftp://propellers.net/maven&lt;/url&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;layout&gt;legacy&lt;/layout&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/snapshotRepository&gt;<br />
id, name:：唯一性的id，和可读性的name<br />
uniqueVersion：指定是否产生一个唯一性的version number还是使用address里的其中version部分。true or false<br />
url：说明location和transport protocol<br />
layout：default或者legacy--&gt;<br />
<strong>&lt;site&gt;&lt;!---声明如何部署project&#8216;s 的site和document-&gt;</strong><br />
&lt;!--例如：<br />
&nbsp;&nbsp;&nbsp; &lt;site&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;id&gt;mojo.website&lt;/id&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;name&gt;Mojo Website&lt;/name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;url&gt;scp://beaver.codehaus.org/home/projects/mojo/public_html/&lt;/url&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/site&gt;<br />
与上面repository的元素相同意思<br />
--&gt;<br />
<a name="Relocation"><strong>Relocation</strong></a>：<br />
&lt;!--&nbsp;说明工程的变更，在这里警告使用者当心工程被重命名了等信息。重新指定id和名称，并且写个message注明备注&nbsp;&nbsp; &lt;relocation&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;groupId&gt;org.apache&lt;/groupId&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;artifactId&gt;my-project&lt;/artifactId&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;version&gt;1.0&lt;/version&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;message&gt;We have moved the Project under Apache&lt;/message&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/relocation&gt;<br />
--&gt;<br />
<strong style="font-size: 18pt">&lt;profiles&gt;...&lt;/profiles&gt;</strong><br />
&lt;!--pom4.0的一个新特性就是具有根据environment来修改设置的能力。</p>
</li>
<p>它包含可选的activation（profile的触发器）和一系列的changes。例如test过程可能会指向不同的数据库（相对最终的deployment）或者不同的dependencies或者不同的repositories，并且是根据不同的JDK来改变的。那么结构如下：</p>
<p>&nbsp; &lt;profiles&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;profile&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;id&gt;test&lt;/id&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;activation&gt;...&lt;/activation&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;build&gt;...&lt;/build&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;modules&gt;...&lt;/modules&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;repositories&gt;...&lt;/repositories&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;pluginRepositories&gt;...&lt;/pluginRepositories&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;dependencies&gt;...&lt;/dependencies&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;reporting&gt;...&lt;/reporting&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;dependencyManagement&gt;...&lt;/dependencyManagement&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;distributionManagement&gt;...&lt;/distributionManagement&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/profile&gt;<br />
&nbsp; &lt;/profiles&gt;<br />
<a name="Activation"><strong>Activation</strong></a>：<br />
触发这个profile的条件配置如下例：（只需要其中一个成立就可以激活profile，如果第一个条件满足了，那么后面就不会在进行匹配。<br />
&nbsp;&nbsp;&nbsp; &lt;profile&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;id&gt;test&lt;/id&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;activation&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;activeByDefault&gt;false&lt;/activeByDefault&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;jdk&gt;1.5&lt;/jdk&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;os&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;name&gt;Windows XP&lt;/name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;family&gt;Windows&lt;/family&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;arch&gt;x86&lt;/arch&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;version&gt;5.1.2600&lt;/version&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/os&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;name&gt;mavenVersion&lt;/name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;value&gt;2.0.3&lt;/value&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;file&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;exists&gt;${basedir}/file2.properties&lt;/exists&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;missing&gt;${basedir}/file1.properties&lt;/missing&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/file&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/activation&gt;<br />
<br />
--&gt;<br />
激活profile的方法有多个：setting文件的activeProfile元素明确指定激活的profile的ID，在命令行上明确激活Profile用-P flag 参数<br />
查看某个build会激活的profile列表可以用：mvn help:active-profiles<br />
&lt;/project&gt; </p>
<img src ="http://www.blogjava.net/jianyue/aggbug/227932.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jianyue/" target="_blank">Qzi</a> 2008-09-16 16:21 <a href="http://www.blogjava.net/jianyue/articles/227932.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>maven2 setting文件详解</title><link>http://www.blogjava.net/jianyue/articles/maven2_setting.html</link><dc:creator>Qzi</dc:creator><author>Qzi</author><pubDate>Mon, 08 Sep 2008 03:01:00 GMT</pubDate><guid>http://www.blogjava.net/jianyue/articles/maven2_setting.html</guid><wfw:comment>http://www.blogjava.net/jianyue/comments/227678.html</wfw:comment><comments>http://www.blogjava.net/jianyue/articles/maven2_setting.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jianyue/comments/commentRss/227678.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jianyue/services/trackbacks/227678.html</trackback:ping><description><![CDATA[<p>以下完全照搬官网：<a href="http://maven.apache.org/settings.html">http://maven.apache.org/settings.html&nbsp; 只是加上一点自己的理解而已<br />
</a>可以具有两个setting文件：<br />
1.$M2_HOME/conf/settring.xml安装Maven就有的系统setting（各个用户有效的全局的）<br />
2.${user.home}/.m2/settring.xml用户自己加在Repository里的setting文件（用户级的）<br />
<br />
元素总览：</p>
<pre>&lt;settings xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/settings-1.0.0.xsd"&gt;
&lt;localRepository/&gt;
&lt;interactiveMode/&gt;
&lt;usePluginRegistry/&gt;
&lt;offline/&gt;
&lt;pluginGroups/&gt;
&lt;servers/&gt;
&lt;mirrors/&gt;
&lt;proxies/&gt;
&lt;profiles/&gt;
&lt;activeProfiles/&gt;
&lt;/settings&gt;
<li><strong>localRepository</strong>:配置本地的Repository路径，可以是绝对路径，通常写的是${user.home}/.m2/repository
<li><strong>interactiveMode</strong>:是否希望maven与用户输入进行交互，true的话，maven就有可能与用户交互，默认是true
<li><strong>usePluginRegistry</strong>:如果需要使用<tt>${user.home}/.m2/plugin-registry.xml来控制plugin的版本的话，就是true，现在默认为false，因为maven2.0，不建议依赖这个文件</tt>
<li><strong>offline</strong>: 是否为离线运行状态，默认为false，对于不能够使用远程Repository的，使用true
<li><strong>pluginGroups</strong>: 包含一组pluginGroup元素，如果在命令行上没有声明使用某个插件，又要用到这个插件，就在这里的pluginGroup里声明。这个列表默认包括org.maven.plugins
<li><strong>Servers</strong>：Repositories的详细定义在pom.xml的distributionManagement中，但是
</li>
</pre>
<font face="Courier New">
<p>&nbsp;&nbsp;&nbsp; &lt;server&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;id&gt;server001&lt;/id&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;username&gt;my_login&lt;/username&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;password&gt;my_password&lt;/password&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;privateKey&gt;${user.home}/.ssh/id_dsa&lt;/privateKey&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;passphrase&gt;some_passphrase&lt;/passphrase&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;filePermissions&gt;664&lt;/filePermissions&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;directoryPermissions&gt;775&lt;/directoryPermissions&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;configuration&gt;&lt;/configuration&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/server&gt;<br />
<br />
这些是在这里定义的。<br />
id：与distributionManagement中的repository中的元素id对应，用于表示一个server<br />
username,password：如果server需要验证的话，这一对元素就是用于验证的<br />
privateKey, passphrase：也是用于服务器验证的，前者指定私钥privateKey（默认<tt>${user.home}/.ssh/id_dsa</tt>），后者指定口号passphrase<br />
filePermissions, directoryPermissions：使用linux中的三位数字形式标示文件与路径的权限，例如664，775等。<br />
注意：如果使用私钥登录服务器的话，那么password就省略，否则，私钥会被忽略。<br />
configuration：官网也没有解释。</p>
</font>
<pre>
<li><strong>Mirrors</strong>
</li>
</pre>
<p>&nbsp;&nbsp;&nbsp; &lt;mirror&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;id&gt;planetmirror.com&lt;/id&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;name&gt;PlanetMirror Australia&lt;/name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;url&gt;http://downloads.planetmirror.com/pub/maven2&lt;/url&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;mirrorOf&gt;central&lt;/mirrorOf&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/mirror&gt;<br />
id，name：server镜像的唯一标识与可读性强的名称（id才是唯一的）</p>
url：mirror的地址<br />
mirrorOf：指定这个镜像代表的server的id，那么以后工程引用这个server的时候将不会使用server而是变成使用mirror的地址<br />
<p>In 2.0.9+, an enhanced syntax is supported:</p>
<ul>
    <li>* matches all repo ids.
    <li>external:* matches all repos except those using localhost or file based repositories. This is used in conjunction with a repository manager when you want to exclude redirecting repositories that are defined for Integration Testing.
    <li>multiple repos may be specified using , as the delimiter
    <li>! may be used in conjunction with one of the above wildcards to exclude a repo id. </li>
</ul>
<p>The order is not important from left to right as the wildcards defer to further processing and explicit includes or excludes stop the processing. Additionally, the mirror list will now be ordered using a LinkedHashMap instead of HashMap such that the user may influence match order by changing the order of the definitions in the settings.xml </p>
<p>Examples:</p>
<ul>
    <li>* = everything
    <li>external:* = everything not on the localhost and not file based.
    <li>repo,repo1 = repo or repo1
    <li>*,!repo1 = everything except repo1 </li>
</ul>
<br />
<pre>
<li><strong>Proxies</strong></li>
</pre>
<p>&nbsp;&nbsp;&nbsp; &lt;proxy&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;id&gt;myproxy&lt;/id&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;active&gt;true&lt;/active&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;protocol&gt;http&lt;/protocol&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;host&gt;proxy.somewhere.com&lt;/host&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;port&gt;8080&lt;/port&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;username&gt;proxyuser&lt;/username&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;password&gt;somepassword&lt;/password&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;nonProxyHosts&gt;*.google.com|ibiblio.org&lt;/nonProxyHosts&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/proxy&gt;<br />
id：表示不同的proxy<br />
active：当有多个proxy的时候，只有active为true的时候才是有效的<br />
protocol，host，port：协议，主机，端口<br />
username，password：如果需要的话就加上<br />
nonProxyHosts：排除不用代理的站点，使用&#8220;|&#8221;或者&#8220;，&#8221;符号分开不同站点，可以使用通配符&#8220;*&#8221;</p>
<pre>
<li><strong>profiles</strong></li>
</pre>
<p><tt>activation</tt>, <tt>repositories</tt>, <tt>pluginRepositories</tt> and <tt>properties</tt> elements<br />
&nbsp;&nbsp;&nbsp;&nbsp;activation指定激活这个profile的条件。其他激活的方法：（1）setting.xml可以通过activeProfile元素指定profile的id，来明确地激活这个profile。（2）在命令行上加上-P profile的id，也可以激活这个profile，其中可以通过&#8220;,&#8221;分开几个profile的id来指定多个。<br />
&nbsp;&nbsp;&nbsp;&nbsp;repositories包含的repository指定依赖，它之前的activation如果符合激活条件的话就开启这个依赖<br />
&nbsp;&nbsp;&nbsp;&nbsp;<tt>pluginRepositories和properties也一样，如果activation符合激活条件，则它们将被激活<br />
例子1：如果使用jdk-1.4的话，jdk的依赖将会被激活<br />
</p>
<p>&nbsp;&nbsp;&nbsp; &lt;profile&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;id&gt;jdk-1.4&lt;/id&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;activation&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;jdk&gt;1.4&lt;/jdk&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/activation&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;repositories&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;repository&gt;<br />
&nbsp;&nbsp; &lt;id&gt;jdk14&lt;/id&gt;<br />
&nbsp;&nbsp; &lt;name&gt;Repository for JDK 1.4 builds&lt;/name&gt;<br />
&nbsp;&nbsp; &lt;url&gt;http://www.myhost.com/maven/jdk14&lt;/url&gt;<br />
&nbsp;&nbsp; &lt;layout&gt;default&lt;/layout&gt;<br />
&nbsp;&nbsp; &lt;snapshotPolicy&gt;always&lt;/snapshotPolicy&gt;<br />
&nbsp;&lt;/repository&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/repositories&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/profile&gt;<br />
<br />
例子2：如果target-env的属性值为dev的时候，就激活tomcatPath的属性，其他地方肯定会有元素引用这个属性，例如后面引用<br />
</p>
<p>&nbsp;&nbsp;&nbsp; &lt;profile&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;id&gt;env-dev&lt;/id&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;activation&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;property&gt;<br />
&nbsp;&nbsp; &lt;name&gt;target-env&lt;/name&gt;<br />
&nbsp;&nbsp; &lt;value&gt;dev&lt;/value&gt;<br />
&nbsp;&lt;/property&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/activation&gt;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;properties&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;tomcatPath&gt;/path/to/tomcat/instance&lt;/tomcatPath&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/properties&gt;<br />
&nbsp;&nbsp;&nbsp; &lt;/profile&gt;<br />
&nbsp;&nbsp;&nbsp; --&gt;<br />
&nbsp; &lt;/profiles&gt;</p>
<p>引用tomcatPath<br />
&nbsp;&nbsp;&nbsp;&nbsp; | &lt;plugin&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp; &lt;groupId&gt;org.myco.myplugins&lt;/groupId&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp; &lt;artifactId&gt;myplugin&lt;/artifactId&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp; &lt;configuration&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp;&nbsp;&nbsp; &lt;tomcatLocation&gt;${tomcatPath}&lt;/tomcatLocation&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; |&nbsp;&nbsp; &lt;/configuration&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp; | &lt;/plugin&gt;<br />
<br />
<br />
</p>
</tt>
<pre>
<li><strong>Properties</strong></li>
</pre>
<p><span style="font-size: 10pt">属性的引用可以通过${}，其中：<br />
<font face="Courier New">1）env.***是引用命令行comandline参数既环境变量等参数的值，例如%{env.PATH}引用环境变量path的值<br />
2）project.***引用pom文件中project的元素值，例如pom中有个<tt>&lt;project&gt;&lt;version&gt;1.0&lt;/version&gt;&lt;/project&gt;</tt>，那么可以%{project.version}<br />
3）setting.***引用setting文件中的元素值，例如：<tt>&lt;settings&gt;&lt;offline&gt;false&lt;/offline&gt;&lt;/settings&gt;</tt> is accessible via <tt>${settings.offline</tt>}<br />
4）java.***,java System Properties：在java语言中可以通过<tt>java.lang.System.getProperties()</tt> 获得的值都可以通过此来获得，例如：${java.home}<br />
5)***是在&lt;properties/&gt;中定义了的可以直接引用的属性，方法%{someVar}。</font></span></p>
<pre>
<li><a name="Repositories">Repositories</a></li>
</pre>
<p>&nbsp;&nbsp;&nbsp;&nbsp; &lt;repositories&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;repository&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;id&gt;codehausSnapshots&lt;/id&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;name&gt;Codehaus Snapshots&lt;/name&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;releases&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;enabled&gt;false&lt;/enabled&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;updatePolicy&gt;always&lt;/updatePolicy&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;checksumPolicy&gt;warn&lt;/checksumPolicy&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/releases&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;snapshots&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;enabled&gt;true&lt;/enabled&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;updatePolicy&gt;never&lt;/updatePolicy&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;checksumPolicy&gt;fail&lt;/checksumPolicy&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/snapshots&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;url&gt;http://snapshots.maven.codehaus.org/maven2&lt;/url&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;layout&gt;default&lt;/layout&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/repository&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/repositories&gt;<br />
<font face="Courier New">1)<strong>releases</strong>, <strong>snapshots</strong>:（理解不了，原文照搬）These are the policies for each type of artifact, Release or snapshot. With these two sets, a POM has the power to alter the policies for each type independent of the other within a single repository. For example, one may decide to enable only snapshot downloads, possibly for development purposes. <br />
2）<strong>enabled</strong>：true或者false来指明这个repository哪个类型被开启<br />
3）<strong>updatePolicy</strong>：升级策略。The choices are: <tt>always</tt>, <tt>daily</tt> (default), <tt>interval:X</tt> (where X is an integer in minutes) or never<br />
4）<strong>checksumPolicy</strong>：When Maven deploys files to the repository, it also deploys corresponding checksum files. options are to <tt>ignore</tt>, <tt>fail</tt>, or <tt>warn</tt> on missing or incorrect checksums<br />
5）<strong>layout</strong>：In the above description of repositories, it was mentioned that they all follow a common layout. This is mostly correct. Maven 2 has a default layout for its repositories; however, Maven 1.x had a different layout. Use this element to specify which if it is <tt>default</tt> or <tt>legacy</tt>. </font></p>
<pre>
<li><a name="Plugin_Repositories">Plugin Repositories</a></li>
</pre>
<p><font face="Courier New">结构如同Repositories，但是可以这样理解，repositories用于工程运行之前的，plugin Repositories用于运行。例如tomcat jetty等都是plugins，而jdk，jar等运行之前的工程编译时候就已经用到了</font></p>
<pre>
<li><strong><strong>activeProfiles如上所说，可以指定一定激活的profile</strong></strong></li>
</pre>
activeProfiles
     <img src ="http://www.blogjava.net/jianyue/aggbug/227678.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jianyue/" target="_blank">Qzi</a> 2008-09-08 11:01 <a href="http://www.blogjava.net/jianyue/articles/maven2_setting.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>