Maven 入門 02 - POM檔案
文章目錄
一、POM 檔案是什麼?
Maven的中心思想即POM檔案((Project Object Model)
專案物件模型)。
POM檔案是以XML檔案的形式,描述專案用到的資源,如原始碼目錄、測試程式碼目錄、依賴(用到的外部Jar包)等。
pom.xml
是整個系統的基礎元件,位於專案根目錄下。
二、Maven 如何使用POM檔案?
上圖說明了Maven是如何使用POM檔案的,當執行一條Maven命令的時候,會依次進行以下步驟:
1、讀取專案根目錄下的pom.xml
,並根據pom.xml
中的描述來執行下一步操作。
2、根據pom.xml
中的<dependencies>
3、構建生命週期、階段和目標。
4、構建外掛。
三、POM檔案的主要組成部分
POM檔案描述的是構建“什麼”,而不是“如何”構建。 如何構建是取決於Maven的構建階段和目標。
每一個專案都有一個POM檔案,即pom.xml,位於專案的根目錄下。
pom.xml 主要包括以下幾部分:
3.1 構建生命週期、階段和目標
Maven的構建過程被分解為構建生命週期、階段和目標。
<build> -> <phase> -> <goals>
-
一個構建週期由一系列的構建階段組成。
-
每一個構建階段由一系列的目標組成。
當我們使用一條命令來執行Maven的時候,這條命令就是構建生命週期、階段或目標的名字。
-
如果執行的是一個生命週期,該生命週期內的所有構建階段都會被執行。
-
如果執行的是一個構建階段,在預定義的構建階段中,所有處於當前構建階段之前的階段也都會被執行。
3.2 依賴和倉庫
<repository> 倉庫節點,<dependencies> 依賴節點
Maven執行時,其中一個首要目標就是檢查專案的依賴(需要的jar 包)。
如果在本地倉庫中不存在該依賴,則Maven會從中央倉庫和遠端倉庫下載並放到本地倉庫。(後面會單獨講解怎麼修改本地倉庫路徑、怎麼新增遠端倉庫)
3.3 構建外掛
<plugins> 節點
構建外掛可以向構建階段中增加額外的構建目標。
如果Maven標準的構建階段和目標無法滿足專案構建的需求,可以在POM檔案裡增加外掛。
Maven有一些標準的外掛供選用,如果需要也可以自己實現外掛。
3.4 配置檔案
<profiles> 節點
配置檔案用於以不同的方式構建專案。
比如,你可能需要在本地環境構建,用於開發和測試,你也可能需要構建後用於開發環境。這兩個構建過程是不同的。
在POM檔案中增加不同的構建配置,可以啟用不同的構建過程。當執行Maven時,可以指定要使用的配置。
四、Maven 專案繼承
1、父子工程中的POM
(以下內容中子專案
與 模組
的概念是類似的,所以也可以對應的理解為模組
)
一個專案如果分為多個子專案/模組,一般來講,父專案有一個POM檔案,每一個子專案也有一個POM檔案。在這種結構下,既可以一步構建整個專案,也可以各個子專案分開構建。
2、 POM 繼承的原理
POM 繼承的原理類似於Java中的類繼承關係,可以結合理解。
當有多個子專案時,使用 POM 繼承可以大大減少配置的工作量。
-
把多個子專案之間一些共性的東西(比如說類似的配置、相同的jar包等等),定義在父專案的pom.xml檔案中。
-
子專案繼承父專案後,在自己的pom.xml中只放自己個性的東西,大大減少了工作量。
-
預設情況下,所有的Maven pom檔案都繼承自一個根pom。如果沒有顯式指定父pom,則該pom檔案繼承自根pom。
-
子pom檔案的設定可以覆蓋父pom檔案的設定,只需要在子pom檔案裡指定新的設定即可。
3、POM繼承關係圖
如果要繼承根pom以外的pom,需要在子pom中顯示地指定父pom。
4、如何顯示指定父pom呢?
- 在子專案的pom.xml起始處設定
<parent>
節點來指定父專案。
如:
<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">
<modelVersion>4.0.0</modelVersion>
<parent> 指定父pom
<groupId>org.codehaus.mojo</groupId>
<artifactId>my-parent</artifactId>
<version>2.0</version>
<relativePath>../my-parent</relativePath>
</parent>
<artifactId>my-project</artifactId>
…
</project>
五、POM檔案欄位解析
如下為一個最小化的POM檔案示例:
<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">
<modelVersion>4.0.0</modelVersion>
<groupId>com.jenkov</groupId>
<artifactId>java-web-crawler</artifactId>
<version>1.0.0</version>
</project>
1、各欄位解析
-
modelVersion
:使用的POM模型的版本。- 一般選擇正在使用的Maven版本一致的版本即可。
- 版本4.0.0適用於Maven 2和3。
-
groupId
:一個組織或者專案(比如開源專案)的唯一ID。一般使用專案的java包的根名稱作為group ID。類似com.xxx.xxxx
。- 使用帶.分隔符的java包名作為groupId,這一點並不是必須的。
- 但是,如果按照這樣的規範來定義groupId,專案將會位於Maven倉庫的結構化目錄中,該結構化目錄與group ID匹配。每一個.是一個目錄分隔符,每一個詞都表示一個目錄。
- 比如:group ID為com.jenkov的專案將位於目錄MAVEN_REPO/com/jenkov中。目錄路徑中的MAVEN_REPO表示Maven倉庫的路徑。
-
artifactId
:正在構建的專案的名稱。- 它也是構建完專案後生成的jar包的檔名的一部分。構建過程的輸出,即構建結果,在Maven中稱為構件(artifact)。通常它就是一個jar包、war包或者EAR包等等。
-
version
:專案的版本號。- 可以用來識別專案不同的發行版。
- 它是artifact ID目錄下的子目錄名。
- 它也用作構建結果即jar包名稱的一部分。
上文中的groupId,artifactId和version屬性,在專案構建後會生成一個jar檔案,位於Maven倉庫的如下路徑中(目錄和檔名):MAVEN_REPO/com/jenkov/java-web-crawler/1.0.0/java-web-crawler-1.0.0.jar
上面只是構建maven專案最基本的一些配置,實際開發中,還會增加更多的配置來輔助構建。