maven pom.xml文件 簡單解析

1.POM代表項目對象模型。
它是 Maven 中工作的基本單位,這是一個 XML 文件。它始終保存在該項目基本目錄中的 pom.xml 文件。
POM 包含的項目是使用 Maven 來構建的,它用來包含各種配置信息。
POM 也包含了目標和插件。在執行任務或目標時,Maven 會使用當前目錄中的 POM。它讀取POM得到所需要的配置信息,然後執行目標。部分的配置可以在 POM 使用如下:
  • project dependencies
  • plugins
  • goals
  • build profiles
  • project version
  • developers
  • mailing list

創建一個POM之前,應該要先決定項目組(groupId),它的名字(artifactId)和版本,因爲這些屬性在項目倉庫是唯一標識的。



2.每個項目只有一個POM文件。
  • 所有的 POM 文件要項目元素必須有三個必填字段: groupIdartifactIdversion
  • 在庫中的項目符號是:groupId:artifactId:version
  • pom.xml 的根元素是 project,它有三個主要的子節點。
節點 描述
groupId 這是項目組的編號,這在組織或項目中通常是獨一無二的。 例如,一家銀行集團com.company.bank擁有所有銀行相關項目。
artifactId 這是項目的ID。這通常是項目的名稱。 例如,consumer-banking。 除了groupId之外,artifactId還定義了artifact在存儲庫中的位置。
version 這是項目的版本。與groupId一起使用,artifact在存儲庫中用於將版本彼此分離。 例如:com.company.bank:consumer-banking:1.0com.company.bank:consumer-banking:1.1





3.buid Plugins

[html] view plain copy
  1. <build>  
  2.     ...  
  3.     <plugins>  
  4.         <plugin>  
  5.             <groupId>org.apache.maven.plugins</groupId>  
  6.             <artifactId>maven-jar-plugin</artifactId>  
  7.             <version>2.0</version>  
  8.             <extensions>false</extensions>  
  9.             <inherited>true</inherited>  
  10.             <configuration>  
  11.                 <classifier>test</classifier>  
  12.             </configuration>  
  13.             <dependencies>...</dependencies>  
  14.             <executions>...</executions>  
  15.         </plugin>  
  16.     </plugins>  
  17. </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:

[html] view plain copy
  1. <plugin>  
  2.     <groupId>my.group</groupId>  
  3.     <artifactId>my-plugin</artifactId>  
  4.     <configuration>  
  5.         <items>  
  6.             <item>parent-1</item>  
  7.             <item>parent-2</item>  
  8.         </items>  
  9.         <properties>  
  10.             <parentKey>parent</parentKey>  
  11.         </properties>  
  12.     </configuration>  
  13. </plugin>  

然後在繼承的孩子POM中做如下配置:

[html] view plain copy
  1. <pre name="code" class="html"><plugin>  
  2.     <groupId>my.group</groupId>  
  3.     <artifactId>my-plugin</artifactId>  
  4.     <configuration>  
  5.         <items>  
  6.             <item>child-1</item>  
  7.         </items>  
  8.         <properties>  
  9.             <childKey>child</childKey>  
  10.         </properties>  
  11.     </configuration>  
  12. </plugin></pre>  

這樣孩子POM和parent POM中都存在groupId爲my.group的plugin,Maven默認的行爲將是根據屬性名稱將兩個plugin的configuration的內容進行合併。如果孩子POM中有一個屬性,則該屬性是有效的,如果孩子POM中沒有一個屬性,但parent POM中存在,則parent中的屬性是有效的。

根據這些規則,上面的例子在Maven中將得到:

[html] view plain copy
  1. <pre name="code" class="html"><plugin>  
  2.     <groupId>my.group</groupId>  
  3.     <artifactId>my-plugin</artifactId>  
  4.     <configuration>  
  5.         <items>  
  6.             <item>child-1</item>  
  7.         </items>  
  8.         <properties>  
  9.             <childKey>child</childKey>  
  10.             <parentKey>parent</parentKey>  
  11.         </properties>  
  12.     </configuration>  
  13. </plugin></pre>  

通過在configuration元素中增加combine.children和combine.self屬性,孩子POM可以控制Maven怎麼合併plugin的configuration。

假定這兒是孩子POM的configuration:

[html] view plain copy
  1. <pre name="code" class="html"><configuration>  
  2.     <items combine.children="append">  
  3.         <!-- combine.children="merge" is the default -->  
  4.         <item>child-1</item>  
  5.     </items>  
  6.     <properties combine.self="override">  
  7.         <!-- combine.self="merge" is the default -->  
  8.         <childKey>child</childKey>  
  9.     </properties>  
  10. </configuration></pre>  

則,現在合併後的效果如下:

[html] view plain copy
  1. <pre name="code" class="html"><configuration>  
  2.     <items combine.children="append">  
  3.         <item>parent-1</item>  
  4.         <item>parent-2</item>  
  5.         <item>child-1</item>  
  6.     </items>  
  7.     <properties combine.self="override">  
  8.         <childKey>child</childKey>  
  9.     </properties>  
  10. </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:

[html] view plain copy
  1. <pre name="code" class="html"><build>  
  2.     <plugins>  
  3.         <plugin>  
  4.             <artifactId>maven-antrun-plugin</artifactId>  
  5.             <version>1.1</version>  
  6.             <executions>  
  7.                 <execution>  
  8.                     <id>echodir</id>  
  9.                     <goals>  
  10.                         <goal>run</goal>  
  11.                     </goals>  
  12.                     <phase>verify</phase>  
  13.                     <inherited>false</inherited>  
  14.                     <configuration>  
  15.                         <tasks>  
  16.                             <echo>Build Dir: ${project.build.directory}</echo>  
  17.                         </tasks>  
  18.                     </configuration>  
  19.                 </execution>  
  20.             </executions>  
  21.         </plugin>  
  22.     </plugins>  
  23. </build></pre>  

id:標識,用於和其他execution區分。當這個階段執行時,它將以這個形式展示:[plugin:goal execution: id]。在這裏爲: [antrun:run execution: echodir];

goals:一個plugin的execution的目標列表;

phase:目標執行的階段,具體值看Maven的生命週期列表;

inherited:是否繼承;

configuration:在指定的目標下的配置。

發佈了21 篇原創文章 · 獲贊 0 · 訪問量 7091
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章