Maven快速入門(四)Maven中的pom.xml檔案詳解

章為忠發表於2020-08-31

上一章,我們講了Maven的座標和倉庫的概念,介紹了Maven是怎麼通過座標找到依賴的jar包的。同時也介紹了Maven的中央倉庫、本地倉庫、私服等概念及其作用。這些東西都是Maven最基本、最核心的概念,大家一定要搞明白。所謂工欲善其事必先利其器,這些基礎的東西一定要掌握。其實,Maven專案中還有一個最核心的檔案:pom.xml 檔案。pom.xml 檔案是Maven專案中的核心專案管理檔案,用於專案描述、依賴管理、構建資訊管理、組織資訊管理等。pom.xml 檔案中包含了許多標籤。接下來介紹一些Maven常用的標籤。

 

一、pom.xml 常用元素

1、座標資訊

pom.xml中最重要的就是專案的座標資訊,主要包含之前介紹的:<groupId>、<artifactId>、<version>、<packaging>等標籤。

(1)<groupId>:定義當前 Maven 專案所屬的實際專案,跟 Java 包名類似,通常與域名反向一一對應。
(2)<artifactId>:定義當前 Maven 專案的一個模組名,預設情況下,Maven 生成的構件,其檔名會以 artifactId 開頭,如 hibernate-core-3.6.5.Final.jar。
(3)<version>:定義專案版本,通常是0.0.1.snapshot,分為snapshot(快照),alpha(內部測試),beta(公測),Release (穩定版),GA (正式版)等。
(4)<packaging>:定義專案打包方式,如 jar,war,pom,zip ……,預設為 jar。

專案中pom.xml 檔案中定義:

 

2、依賴列表

依賴列表包含<dependancies>和<dependancy> 標籤

<dependancy> 是pom.xml 檔案中非常重要的標籤。宣告專案依賴哪些 jar 包以及 所依賴jar 的座標等資訊。

<dependency>
  <groupId></groupId>
  <artifactId></artifactId>
  <version></version>
  <scope></scope>
  <optional></optional>
  <exclusions></exclusions>
</dependency>

如上面中示例中:

(1)<groupId>和<artifactId>  為jar包的座標資訊,確定依賴的jar包的位置。

(2)<version>  為jar 包對應的版本。

(3)<scope>  指依賴的範圍,主要包含:            

    compile(編譯範圍):預設的scope,執行期有效,需要打入包中
    provided:編譯期有效,執行期不需要提供,不會打入包中
    runtime:編譯不需要,在執行期有效,需要匯入包中。(介面與實現分離)
    test:測試需要,不會打入包中
    system:非本地倉庫引入、存在系統的某個路徑下的jar。(一般不使用)

 

  <scope> 非常重要,也非常難懂接下來我會專門講maven的依賴範圍。

(4)<optional>  設定依賴是否可選,有true和false,預設是false。

(5)<exclusions> 排除依賴傳遞列表。

 

3、依賴管理

依賴管理 <dependencyManagement> 主要作用是管理子專案的公共的依賴。

假如某個的模組很多,一些公共的jar包,每個模組都需要引用一遍很麻煩。為了專案的正確執行,必須讓所有的子專案使用依賴項的統一版本,必須確保應用的各個專案的依賴項和版本一致,才能保證測試的和釋出的是相同的結果。所以如果抽象出一個父工程來管理子專案的公共的依賴。

在我們專案頂層的POM檔案中,我們會看到dependencyManagement元素。通過它元素來管理jar包的版本,讓子專案中引用一個依賴而不用顯示的列出版本號。Maven會沿著父子層次向上走,直到找到一個擁有dependencyManagement元素的專案,然後它就會使用在這個dependencyManagement元素中指定的版本號。

這樣, 就能統一管理專案的版本號,確保應用的各個專案的依賴和版本一致,保證測試的和釋出的是相同的程式。

 

4、<parent> 和 <modules>

(1)<parent> 通常用於子模組中,對父模組中pom的繼承。類似上面提到的,一般我們會將一些公共的jar包定義在父工程,然後子模組則通過<parent>標籤基礎相關的pom依賴。

假如一個專案有三個模組,它們都需要用到同一個jar包:common.jar。我們分別在三個專案的pom.xml 檔案中定義各自對common.jar的依賴,那麼當common.jar的版本發生變化時,三個專案的pom檔案都要改,專案模組越多要改的地方就越多。這時候就需要用到<parent> 標籤, 我們建立一個parent專案,打包型別為pom,parent專案中不存放任何程式碼,只是管理多個專案之間公共的依賴。在parent專案的pom檔案中定義對common.jar的依賴,ABC三個子專案中只需要定義<parent></parent>,parent標籤中寫上parent專案的pom座標就可以引用到common.jar了。

 

(2)<modules> 用來聚合多個maven 模組,假如我們專案中有多個模組,那麼通過<modules> 標籤將這些子模組聚合,統一編譯。

假如我們的專案分成了好幾個模組,那麼我們構建的時候是不是有幾個模組就需要構建幾次了(到每個模組的目錄下執行mvn命令)?當然,你逐個構建沒問題,但是非要這麼麻煩的一個一個的構建嗎,那麼簡單的做法就是使用聚合,一次構建全部模組。

<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.youzhibing.account</groupId>
  <artifactId>account-aggregator</artifactId>
  <version>1.0.0-SNAPSHOT</version>
  <packaging>pom</packaging>

  <name>Account Aggrregator</name>
  <url>http://maven.apache.org</url>
  
  <modules>
    <!-- 模組都寫在此處 -->
      <module>account-register</module>      <module>account-login</module>
  </modules>

</project>

 

最後

以上,就把Maven專案中的pom檔案的常用標籤介紹完。磨刀不誤砍柴工,pom.xml 檔案雖然簡單,但是還是必須牢牢掌握。接下來會講Maven 中最重要,也是最麻煩的依賴關係。

 

相關文章