1. 程式人生 > 其它 >第五章 Maven-構建生命週期、階段、目標

第五章 Maven-構建生命週期、階段、目標

一、概述

專案的構建通常包含數個相互獨立的大塊任務,可以獨立執行,如生成文件,構建jar包等。單個任務的執行過程被稱為一個構建生命週期,構建生命週期由一系列的構建階段組成,每個階段包含一系列的構建目標。

我們可以執行構建階段或構建目標。階段按順序執行,執行一個階段則會先執行該階段之前的所有階段。當執行構建階段時,將會按順序執行其中包含的所有構建目標。構建目標可以被分配到一個或多個構建階段。我們還可以直接執行構建目標。

二、構建生命週期

如前所述,Maven構建遵循特定的生命週期來構建和部署專案。

Maven有3個內建的構建生命週期:

# 1.default – 編譯原始碼並處理打包專案相關的所有事情
# 2.clean – 清理構建輸出,包括生成的編譯類、JAR檔案等	
# 3.site – 為專案生成文件
	
每一個構建生命週期都是獨立執行的,可以讓Maven同時執行多個構建生命週期,它們之間彼此獨立,就像獨立執行Maven命令一樣。

三、構建階段

每個構建生命週期包含一系列的構建階段,每個構建階段又包含了一系列的構建目標。

當執行一個構建階段時,該階段之前的所有階段也將被執行。例如,執行install構建階段,首先會執行該階段之前的所有階段,然後執行install階段。

預設生命週期的作用是構建程式碼,是最重要的構建生命週期,它不能直接執行,要通過執行它的構建階段或目標來執行。預設生命週期包含非常多的階段及目標,其中常用的構建階段是:

# 1.validate 驗證專案是正確的,所有必要資訊都可用,所有依賴項都已下載。
# 2.compile 編譯專案原始碼。
# 3.test 使用適當的單元測試框架對編譯後的原始碼執行測試。
# 4.package 將編譯後的程式碼打包成可釋出格式,例如JAR。
# 5.install 將包安裝到本地儲存庫中,以便在本地的其他專案中作為依賴項使用。
# 6.deploy 將最終包複製到遠端儲存庫,以便與其他開發人員和專案共享。

通過將階段名稱傳遞給mvn命令,可以執行一個構建階段。

mvn install

這個例子執行專案的install階段,首先會執行它之前的所有構建階段,然後再執行install階段。

如果標準的階段和目標不能滿足專案需要,還可以建立自定義構建外掛來實現額外構建功能。

四、構建目標

每個構建階段都包含一系列構建目標,當執行一個階段時,所有繫結到這個階段的目標都將按順序執行。

構建目標本身屬於一個外掛,外掛是構建目標的集合,也稱為MOJO (Maven Old Java Object)。可以把外掛理解為一個類,構建目標是類中的方法,構建階段是是對這些方法的順序呼叫。

構建目標可以繫結到多個構建階段,也可以不繫結,就像類的方法可以被呼叫,也可以不被呼叫。

可以使用以下命令列出繫結到特定階段的所有目標及其所屬外掛:

mvn help:describe -Dcmd=PHASENAME

例如,要列出所有繫結到編譯階段的目標:

mvn help:describe -Dcmd=compile

輸出:

compile' is a phase corresponding to this plugin:
org.apache.maven.plugins:maven-compiler-plugin:3.1:compile

意思是編譯器外掛的編譯目標被繫結到編譯階段。

構建目標可以被直接執行:

mvn [plugin-name]:[goal-name]


# 示例:

mvn dependency:copy-dependencies

五、專案構建常用命令

1.mvn deploy

# 要構建Maven專案,我們需要通過執行其中一個階段來執行某個生命週期:

mvn deploy

2.mvn install

# 這將執行整個預設生命週期。有時,我們只需執行到安裝階段為止:

mvn install

但通常我們會用以下命令:

mvn clean install

在新構建之前,首先通過執行clean生命週期來清理專案。

3.執行特定目標

# 我們也可以只執行某個特定目標:

mvn compiler:compile

ps:如果我們試圖在沒有指定階段或目標的情況下構建Maven專案,將會導致以下錯誤:
[ERROR] No goals have been specified for this build. You must specify a valid lifecycle phase or a goal