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="//maven.apache.org/POM/4.0.0" xmlns:xsi="//www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="//maven.apache.org/POM/4.0.0 //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 中最重要,也是最麻煩的依賴關係。