1. 程式人生 > >Maven 入門 02 - POM檔案

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專案最基本的一些配置,實際開發中,還會增加更多的配置來輔助構建。