上一章,我們講了Maven的坐标和倉庫的概念,介紹了Maven是怎麼通過坐标找到依賴的jar包的。同時也介紹了Maven的中央倉庫、本地倉庫、私服等概念及其作用。這些東西都是Maven最基本、最核心的概念,大家一定要搞明白。
所謂工欲善其事必先利其器,這些基礎的東西一定要掌握。其實,Maven項目中還有一個最核心的檔案:pom.xml 檔案。pom.xml 檔案是Maven項目中的核心項目管理檔案,用于項目描述、依賴管理、建構資訊管理、組織資訊管理等。pom.xml 檔案中包含了許多标簽。接下來介紹一些Maven常用的标簽。
一、檔案結構
Maven項目根目錄下的pom.xml檔案是Maven項目中非常重要的配置檔案。主要描述項目包的依賴和項目建構時的配置。pom.xml配置檔案主要分4部分,分别是:
- 項目的描述資訊
- 項目的依賴配置資訊
- 建構時需要的公共變量
- 建構配置
下面就來一一介紹pom.xml檔案各個組成部分以及它們的作用。
二、各部分說明
1. 項目的描述資訊
pom.xml中最重要的就是項目的坐标資訊,主要包含之前介紹的:<groupId>、<artifactId>、<version>、<packaging>等标簽。pom.xml 檔案中定義如下:
<groupId>com.wei</groupId>
<artifactId>hello</artifactId>
<version>2.0.5.RELEASE</version>
<packaging>jar</packaging>
<name>hello</name>
<description>Demo project for Spring Boot</description>
上面的配置内容基本是建立項目時定義的有關項目的基本描述資訊,其中比較重要的是groupId、artifactId。各個屬性說明如下:
- groupId:項目的包路徑。
- artifactId:項目名稱。
- version:項目版本号。
- packaging:一般有jar、war兩個值,表示使用 Maven打包時是建構成JAR包還是WAR包。
- name:項目名稱。
- description:項目描述。
2. 項目的依賴配置資訊
此部分為項目的依賴資訊,主要包括Spring Boot的版本資訊和第三方元件的版本資訊。示例代碼如下:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.5.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
上述描述項目的依賴資訊主要分為parent和dependencies兩部分。
- parent:配置父級項目的資訊。Maven支援項目的父子結構,引入後會預設繼承父級的配置。此項目中引入spring-boot-starter-parent 定義Spring Boot的基礎版本。
- dependencies:配置項目所需要的依賴包,Spring Boot體系内的依賴元件不需要填寫具體版本号,spring-boot-starter-parent維護了體系内所有依賴包的版本資訊。
- dependency:Maven項目定義依賴庫的重要标簽,通過groupId、artifactId等“坐标”資訊定義依賴庫的路徑資訊。
- scope:指依賴的範圍, 非常重要,也非常難懂接下來我會專門講maven的依賴範圍。主要包含:
compile(編譯範圍):預設的scope,運作期有效,需要打入包中
provided:編譯期有效,運作期不需要提供,不會打入包中
runtime:編譯不需要,在運作期有效,需要導入包中。(接口與實作分離)
test:測試需要,不會打入包中
system:非本地倉庫引入、存在系統的某個路徑下的jar。(一般不使用)
- optional:設定依賴是否可選,有true和false,預設是false。
- exclusions:排除依賴傳遞清單。
此外,Maven的項目支援父子繼承,子項目的pom檔案繼承父項目的pom檔案中的配置。
假如某個的子產品很多,一些公共的jar包,每個子產品都需要引用一遍很麻煩。為了項目的正确運作,必須讓所有的子項目使用依賴項的統一版本,必須確定應用的各個項目的依賴項和版本一緻,才能保證測試的和釋出的是相同的結果。是以如果抽象出一個父工程來管理子項目的公共的依賴。
在我們項目頂層的pom檔案中,我們會看到《dependencyManagement》元素。通過它元素來管理jar包的版本,讓子項目中引用一個依賴而不用顯示的列出版本号。Maven會沿着父子層次向上走,直到找到一個擁有dependencyManagement元素的項目,然後它就會使用在這個dependencyManagement元素中指定的版本号。

如上圖所示,我們可以通過<modules> 來聚合多個maven 子產品,假如我們項目中有多個子產品,那麼通過<modules> 标簽将這些子子產品聚合,統一編譯。
假如我們的項目分成了好幾個子產品,那麼我們建構的時候是不是有幾個子產品就需要建構幾次了(到每個子產品的目錄下執行mvn指令)?當然,你逐個建構沒問題,但是非要這麼麻煩的一個一個的建構嗎,那麼簡單的做法就是使用聚合,一次建構全部子產品。
3. 建構建構時需要的公共變量
這裡面定義pom中的公共變量:
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
上面配置了項目建構時所使用的編碼,輸出所使用的編碼,最後指定了項目使用的JDK版本。
4. 建構配置
此部分為建構配置資訊,這裡使用Maven建構Spring Boot項目,是以必須需要在<plugins>中添加 spring-boot-maven-plugin 插件,它能夠以Maven的方式為應用提供Spring Boot的支援。
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
配置spring-boot-maven-plugin建構插件,将Spring Boot應用打包為可執行的JAR或WAR檔案,然後以簡單的方式運作Spring Boot應用。如果需要更改為Docker相關的配置,則隻要更改此部分即可。
最後
以上,就把Maven項目中的pom檔案的常用标簽介紹完。磨刀不誤砍柴工,pom.xml 檔案雖然簡單,但是還是必須牢牢掌握。接下來會講Maven 中最重要,也是最麻煩的依賴關系。