Maven 是一種用來管理 Java 項(xiàng)目的工具,它處理的是一個(gè)具體項(xiàng)目所涉及的各種任務(wù)浩螺,如編譯、測試仍侥、打包要出、文檔以及分發(fā)。
Maven 包括一下幾個(gè)部分:
- 一組用于處理依賴管理农渊、目錄結(jié)構(gòu)以及構(gòu)建工作流的約定患蹂。
- 一個(gè)用于項(xiàng)目配置的
XML Schema
:項(xiàng)目對象模型(Project Object Model),簡稱 POM砸紊。 - 一個(gè)委托外部組件來執(zhí)行項(xiàng)目任務(wù)的插件架構(gòu)传于。
POM 文件大綱
<project>
<groupId></groupId>
<!-- 唯一地第一個(gè) Maven 項(xiàng)目的值 -->
<artifactId></artifactId>
<version></version>
<!-- 該項(xiàng)目所產(chǎn)生的構(gòu)建類型,默認(rèn)值是 jar -->
<packaging></packaging>
<!-- 在 POM 中所引用的符號 -->
<properties></properties>
<!-- 構(gòu)建當(dāng)前項(xiàng)目所需要的其他 Maven 項(xiàng)目 -->
<dependencies></dependencies>
<!-- 構(gòu)建該項(xiàng)目所需要執(zhí)行的任務(wù)的配置 -->
<build></build>
<!-- 為不同的用例自定義 POM 的命名的配置 -->
<profiles></profiles>
</project>
Maven 構(gòu)件
任何可以被 Maven 坐標(biāo)系統(tǒng)
唯一標(biāo)識的對象都是一個(gè) Maven 構(gòu)件
醉顽。大多數(shù)情況下沼溜,構(gòu)件是構(gòu)建 Maven 項(xiàng)目所生成的文件,如 JAR游添。但是系草,只包含其他 POM 使用的定義的 POM 文件也是 Maven 構(gòu)件。
Maven 構(gòu)件類型由<packaging>
元素制定唆涝,最常用的值是pom
找都、jar
、war
以及 maven-plugin
廊酣。
GAV 坐標(biāo)
POM 定義了 5 種稱為坐標(biāo)的元素能耻,用于標(biāo)識 Maven 構(gòu)件
。GAV 是指必須始終指定的 3 個(gè)坐標(biāo):<groupId>
亡驰、<artifactID>
以及 <version>
晓猛。
-
<groupId>
:項(xiàng)目或者項(xiàng)目組的全局唯一標(biāo)識符,通常是 Java 源代碼種使用的全局限定包名隐解。 -
<artifactId>
:用于標(biāo)示和某個(gè)<groupId>
相關(guān)的不同的構(gòu)件鞍帝。 -
<type>
:和項(xiàng)目相關(guān)的主要構(gòu)件類型诫睬,默認(rèn)值是 jar煞茫。 -
<version>
:標(biāo)識構(gòu)件
的版本。 -
<classifier>
:用于區(qū)分屬于相同的 POM 但是卻被以不同的方式構(gòu)建的構(gòu)件摄凡。
完整的坐標(biāo)表達(dá)式:artifactId:groupId:packaging:version:classifier
POM 文件的用例
可以通過以下方式來使用 POM 文件:
- 默認(rèn)的 - 用于構(gòu)建一個(gè)構(gòu)件
- 父 POM - 提供一個(gè)由子項(xiàng)目繼承的單個(gè)配置信息源续徽,聲明這個(gè) POM 文件作為他們的
parent
元素的值。 - 聚合器 - 用于構(gòu)建聲明為
<modules>
的項(xiàng)目亲澡,這些子項(xiàng)目位于其當(dāng)前聚合器項(xiàng)目的文件夾中钦扭,每個(gè)都包含有它自己的 POM 文件。
作為父 POM 或者聚合器的 POM 文件的
<packaging>
元素的值應(yīng)該是 pom床绪。一個(gè) POM 文件可能同時(shí)提供兩項(xiàng)功能客情。
構(gòu)建的生命周期
Maven 構(gòu)件的生命周期是一個(gè)明確定義的用于構(gòu)建和分發(fā)的過程其弊。有 3 個(gè)內(nèi)置的構(gòu)建生命周期:clean
、default
和 site
膀斋。
一個(gè)構(gòu)建生命周期由一系列的階段組成:
-
validate
檢查項(xiàng)目是否正確梭伐,所有必須的信息是否已經(jīng)就緒。 -
process-sources
處理源代碼仰担,如過濾任何值糊识。 -
compile
編譯項(xiàng)目的源代碼。 -
process-test-resources
復(fù)制并處理資源刀測試目標(biāo)目錄中摔蓝。 -
test-compile
將測試源代碼編譯到測試目標(biāo)目錄中赂苗。 -
test
使用合適的單元測試框架測試編譯的源代碼。 -
package
將編譯的代碼打包為它可分發(fā)的格式贮尉,如 JAR拌滋。 -
integration-test
處理并將軟件包部署到一個(gè)可以運(yùn)行集成測試的環(huán)境中。 -
verify
運(yùn)行任何的檢查以驗(yàn)證軟件包是否有效猜谚,并且符合質(zhì)量標(biāo)準(zhǔn)鸠真。 -
install
將軟件包安裝到本地存儲庫中,在那里其他本地構(gòu)建項(xiàng)目可以將它引用為依賴龄毡。 -
deploy
將最終的構(gòu)件上傳到遠(yuǎn)程存儲庫吠卷,以與其他開發(fā)人員和項(xiàng)目共享。
依賴
項(xiàng)目依賴是指編譯和執(zhí)行它所需要的外部構(gòu)件沦零,Maven 中的依賴在 <dependency>
中聲明祭隔,GAV 坐標(biāo)是必不可少的。type
和 scope
元素對于那些值不是 jar
和 compile
的依賴來說也是必不可少的路操。
<scope>
元素可以具有以下值:
-
compile
編譯和執(zhí)行需要的默認(rèn)值疾渴。 -
runtime
只有執(zhí)行需要。 -
optional
不會被其他引用這個(gè)項(xiàng)目所產(chǎn)生的構(gòu)件項(xiàng)目視為傳遞依賴屯仗。 -
provided
不會被包含在由這個(gè) POM 產(chǎn)生的 WAR 文件的 WEB_INF/lib 目錄中搞坝。 -
test
只有編譯和測試的執(zhí)行需要。 -
import
把外部 POM 的<dependencyManagement>
元素的內(nèi)容導(dǎo)入到當(dāng)前 POM 的<dependencyManagement>
元素中魁袜。
依賴管理
POM 的 <dependencyManagement>
元素可以包含被其他項(xiàng)目使用的<dependency>
聲明桩撮,這樣的 POM 子項(xiàng)目將會自動繼承這些聲明。
引用了 <dependencyManagement>
元素的項(xiàng)目可以使用它所聲明的依賴峰弹,而不需要指定它們的<version>
坐標(biāo)店量,如果 <dependencyManagement>
中的 <version>
有所改變,則引用它的 POM 也會改變鞠呈。
插件
雖然 Maven 協(xié)調(diào)了所有構(gòu)建生命周期階段的執(zhí)行融师,但是它并沒有直接實(shí)現(xiàn)他們,相反蚁吝,Maven 將它們委托給了插件旱爆,這些插件是 maven-plugin
類型的構(gòu)件
(打包為 JAR 文件)舀射。
Apache Maven 項(xiàng)目為標(biāo)準(zhǔn)構(gòu)件生命周期所定義的任務(wù)都提供了插件,更多是由第三方產(chǎn)生的怀伦,用于處理各種自定義的任務(wù)后控。
插件可能擁有多個(gè)內(nèi)部步驟或者目標(biāo),也可以被單獨(dú)調(diào)用空镜。例如在一個(gè) JAR 項(xiàng)目中浩淘,默認(rèn)的構(gòu)建生命周期由 maven-jar-plugin
處理,其將構(gòu)建的各個(gè)階段映射到了它自己的以及其他插件的目標(biāo)中吴攒。
插件管理
<pluginManagement>
聲明了其他 POM 可以使用的信息张抄,但是這只適用于子 POM,因?yàn)閷τ诓寮碚f洼怔,沒有導(dǎo)入聲明署惯。
在聲明由 Maven 項(xiàng)目生成的插件時(shí),可以省略 groupId
(org.apache.maven.plugins)镣隶。maven
開頭的 artifactId
僅供 Maven 項(xiàng)目使用极谊。
配置文件
配置文件(在 <profiles>
中定義)是一組自定義的 POM 元素,可以通過自動或手動啟用來改變 POM 的行為安岂。
存儲庫
Maven 的構(gòu)件存儲庫可能是遠(yuǎn)程的轻猖,也可能是本地的。
- 遠(yuǎn)程存儲庫是一個(gè) Maven 從其下載 POM 文件所引用的依賴服務(wù)域那。
- 本地存儲庫是一個(gè)本地的目錄咙边,其包含從遠(yuǎn)程存儲庫下載的構(gòu)件,以及在本地機(jī)器上構(gòu)建并安裝的構(gòu)件次员。通常目錄為
~/.m2/repository
败许,Maven 存儲庫的物理目錄結(jié)構(gòu)使用 GAV 坐標(biāo)。