<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/xsd/maven-4.0.0.xsd"> ... <!-- "Project Build" contains more elements than just the BaseBuild set --> <build>...</build> <profiles> <profile> <!-- "Profile Build" contains a subset of "Project Build"s elements --> <build>...</build> </profile> </profiles> </project>
BaseBuild元素集合
basic elements
<build> <defaultGoal>install</defaultGoal> <directory>${basedir}/target</directory> <finalName>${artifactId}-${version}</finalName> <filters> <filter>filters/filter1.properties</filter> </filters> ... </build>
1、defaultGoal:執行build任務時,如果沒有指定目標,將使用的默認值,如:在命令行中執行mvn,則相當於執行mvn install;
2、directory:build目標文件的存放目錄,默認在${basedir}/target目錄;
3、finalName:build目標文件的文件名,默認情況下為${artifactId}-${version};
4、filter:定義*.properties文件,包含一個properties列表,該列表會應用的支持filter的resources中。也就是說,定義在filter的文件中的"name=value"值對會在build時代替${name}值應用到resources中。Maven的默認filter文件夾是${basedir}/src/main/filters/。
resources
build的另一個特征是指定你的項目中resources的位置。resources(通常)不是代碼,他們不被編譯,但是被綁定在你的項目或者用於其它什么原因,例如代碼生成。
<build> ... <resources> <resource> <targetPath>META-INF/plexus</targetPath> <filtering>false</filtering> <directory>${basedir}/src/main/plexus</directory> <includes> <include>configuration.xml</include> </includes> <excludes> <exclude>**/*.properties</exclude> </excludes> </resource> </resources> <testResources> ... </testResources> ... </build>
1、resources:一個resource元素的列表,每一個都描述與項目關聯的文件是什么和在哪里;
2、targetPath:指定build后的resource存放的文件夾。該路徑默認是basedir。通常被打包在JAR中的resources的目標路徑為META-INF;
3、filtering:true/false,表示為這個resource,filter是否激活。
4、directory:定義resource所在的文件夾,默認為${basedir}/src/main/resources;
5、includes:指定作為resource的文件的匹配模式,用*作為通配符;
6、excludes:指定哪些文件被忽略,如果一個文件同時符合includes和excludes,則excludes生效;
7、testResources:定義和resource類似,但只在test時使用,默認的test resource文件夾路徑是${basedir}/src/test/resources,test resource不被部署。
Plugins
<build> ... <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>2.0</version> <extensions>false</extensions> <inherited>true</inherited> <configuration> <classifier>test</classifier> </configuration> <dependencies>...</dependencies> <executions>...</executions> </plugin> </plugins> </build>
除了groupId:artifactId:version標准坐標,plugin還需要如下屬性:
1、extensions:true/false,是否加載plugin的extensions,默認為false;
2、inherited:true/false,這個plugin是否應用到該POM的孩子POM,默認true;
3、configuration:配置該plugin期望得到的properies,如上面的例子,我們為maven-jar-plugin的Mojo設置了classifier屬性;
如果你的POM有一個parent,它可以從parent的build/plugins或者pluginManagement集成plugin配置。
為了闡述繼承后的關系,考慮如果parent POM中存在如下plugin:
<plugin> <groupId>my.group</groupId> <artifactId>my-plugin</artifactId> <configuration> <items> <item>parent-1</item> <item>parent-2</item> </items> <properties> <parentKey>parent</parentKey> </properties> </configuration> </plugin>
然后在繼承的孩子POM中做如下配置:
<pre name="code" class="html"><plugin> <groupId>my.group</groupId> <artifactId>my-plugin</artifactId> <configuration> <items> <item>child-1</item> </items> <properties> <childKey>child</childKey> </properties> </configuration> </plugin></pre>
這樣孩子POM和parent POM中都存在groupId為my.group的plugin,Maven默認的行為將是根據屬性名稱將兩個plugin的configuration的內容進行合並。如果孩子POM中有一個屬性,則該屬性是有效的,如果孩子POM中沒有一個屬性,但parent POM中存在,則parent中的屬性是有效的。
根據這些規則,上面的例子在Maven中將得到:
<pre name="code" class="html"><plugin> <groupId>my.group</groupId> <artifactId>my-plugin</artifactId> <configuration> <items> <item>child-1</item> </items> <properties> <childKey>child</childKey> <parentKey>parent</parentKey> </properties> </configuration> </plugin></pre>
通過在configuration元素中增加combine.children和combine.self屬性,孩子POM可以控制Maven怎么合並plugin的configuration。
假定這兒是孩子POM的configuration:
<pre name="code" class="html"><configuration> <items combine.children="append"> <!-- combine.children="merge" is the default --> <item>child-1</item> </items> <properties combine.self="override"> <!-- combine.self="merge" is the default --> <childKey>child</childKey> </properties> </configuration></pre>
則,現在合並后的效果如下:
combine.children="append"表示父POM和子POM的屬性合並起來;
combine.self="override"表示子POM的屬性完全覆蓋父POM的。
4、dependencies:同base build中的dependencies有同樣的結構和功能,但這里是作為plugin的依賴,而不是項目的依賴。
5、executions:plugin可以有多個目標,每一個目標都可以有一個分開的配置,甚至可以綁定一個plugin的目標到一個不同的階段。executions配置一個plugin的目標的execution。
假定一項綁定antrun:run目標到verify階段,我們希望任務響應build文件夾,同時避免傳遞配置到他的孩子POM。你將得到一個execution:
<pre name="code" class="html"><build> <plugins> <plugin> <artifactId>maven-antrun-plugin</artifactId> <version>1.1</version> <executions> <execution> <id>echodir</id> <goals> <goal>run</goal> </goals> <phase>verify</phase> <inherited>false</inherited> <configuration> <tasks> <echo>Build Dir: ${project.build.directory}</echo> </tasks> </configuration> </execution> </executions> </plugin> </plugins> </build></pre>
id:標識,用於和其他execution區分。當這個階段執行時,它將以這個形式展示:[plugin:goal execution: id]。在這里為: [antrun:run execution: echodir];
goals:一個plugin的execution的目標列表;
phase:目標執行的階段,具體值看Maven的生命周期列表;
inherited:是否繼承;
configuration:在指定的目標下的配置。
Plugin Management
pluginManagement的元素的配置和plugins的配置是一樣的,只是這里的配置只是用於集成,在孩子POM中指定使用。例如,在父POM中做如下配置:
<build> ... <pluginManagement> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>2.2</version> <executions> <execution> <id>pre-process-classes</id> <phase>compile</phase> <goals> <goal>jar</goal> </goals> <configuration> <classifier>pre-process</classifier> </configuration> </execution> </executions> </plugin> </plugins> </pluginManagement> ... </build>
則在孩子POM中,我們只需要配置:
<build> ... <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> </plugin> </plugins> ... </build>
這樣就可以大大的簡化孩子POM中的配置。
Reporting
Reporting包含的屬性對應到site階段(見Maven生命周期)。特定的Maven插件能產生定義和配置在reporting元素下的報告,例如:產生Javadoc報告。
<reporting> <outputDirectory>${basedir}/target/site</outputDirectory> <plugins> <plugin> <artifactId>maven-project-info-reports-plugin</artifactId> <version>2.0.1</version> <reportSets> <reportSet></reportSet> </reportSets> </plugin> </plugins> </reporting>
對於reportSets:
<reportSets> <reportSet> <id>sunlink</id> <reports> <report>javadoc</report> </reports> <inherited>true</inherited> <configuration> <links> <link>http://java.sun.com/j2se/1.5.0/docs/api/</link> </links> </configuration> </reportSet> </reportSets>
