Maven快速入門(四)Maven中的pom.xml檔案詳解
上一章,我們講了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 中最重要,也是最麻煩的依賴關係。
&n