pom.xml
文件。POM 也包含了目標和插件。在執行任務或目標時,Maven 會使用當前目錄中的 POM。它讀取POM得到所需要的配置信息,然後執行目標。部分的配置可以在 POM 使用如下:
- project dependencies
- plugins
- goals
- build profiles
- project version
- developers
- mailing list
創建一個POM之前,應該要先決定項目組(groupId),它的名字(artifactId)和版本,因爲這些屬性在項目倉庫是唯一標識的。
- 所有的 POM 文件要項目元素必須有三個必填字段:
groupId
,artifactId
,version
- 在庫中的項目符號是:
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.0 ,com.company.bank:consumer-banking:1.1 |
- <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>
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>
則,現在合併後的效果如下:
- <pre name="code" class="html"><configuration>
- <items combine.children="append">
- <item>parent-1</item>
- <item>parent-2</item>
- <item>child-1</item>
- </items>
- <properties combine.self="override">
- <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:在指定的目標下的配置。