Maven中生命周期的具體使用
本篇文章重點(diǎn)針對(duì)這幾個(gè)問(wèn)題進(jìn)行講解:
- maven的生命周期都有哪些階段?
- maven的生命周期和插件到低有什么關(guān)聯(lián)?
- 插件和插件的目標(biāo)有什么關(guān)聯(lián)?
- 假如我們要用某個(gè)插件,怎么上官網(wǎng)查找?
- 怎么手動(dòng)調(diào)用插件?
一、生命周期(clean+site+default)
在 Maven 出現(xiàn)之前,項(xiàng)目構(gòu)建的生命周期就已經(jīng)存在,開(kāi)發(fā)人員每天都在對(duì)項(xiàng)目進(jìn)行清理,編譯,測(cè)試及部署,但由于沒(méi)有統(tǒng)一的規(guī)范,不同公司甚至不同項(xiàng)目之間的構(gòu)建的方式都不盡相同。
Maven 從大量項(xiàng)目和構(gòu)建工具中學(xué)習(xí)和反思,最后總結(jié)了一套高度完美的,易擴(kuò)展的生命周期。這個(gè)生命周期將項(xiàng)目的清理、初始化、編譯、測(cè)試、打包、集成測(cè)試、驗(yàn)證、部署和站點(diǎn)生成等幾乎所有構(gòu)建過(guò)程進(jìn)行了抽象和統(tǒng)一。
1、生命周期與插件的關(guān)系
Maven 生命周期是抽象的,其本身不能做任何實(shí)際工作,這些實(shí)際工作(如源代碼編譯)都通過(guò)調(diào)用 Maven 插件 中的插件目標(biāo)(plugin goal)完成的。
為了更好的理解 Maven 生命周期、插件以及插件目標(biāo)三者的關(guān)系,我們可以 將 Maven 生命周期理解成一個(gè)抽象父類(lèi)
, 將插件理解成其子類(lèi)
, 將插件目標(biāo)理解成子類(lèi)中重寫(xiě)的方法
,其基本結(jié)構(gòu)與下面的示例代碼相似。
/** * 模擬 maven 生命周期 */ public abstract class LifeCycle { //定義構(gòu)建過(guò)程 public void build() { //模擬生命周期各個(gè)階段,即調(diào)用插件中目標(biāo) clean(); initialize(); compile(); packager(); install(); } //定義清理的過(guò)程 public abstract void clean(); //定義初始化的過(guò)程 public abstract void initialize(); //定義編譯的過(guò)程 public abstract void compile(); //定義打包的過(guò)程 public abstract void packager(); //定義安裝的過(guò)程 public abstract void install(); }
模擬 clean 插件的子類(lèi),代碼如下。
/** * 子類(lèi)模擬clean 相關(guān)的插件 */ public abstract class CleanPlugin extends LifeCycle { //重寫(xiě)父類(lèi)(生命周期)的清理工作 //模擬插件目標(biāo) @Override public void clean() { System.out.println("清理"); } }
以上示例中,父類(lèi) LifeCycle 模擬的是 Maven 生命周期,子類(lèi) CleanPlugin 模擬的是 Maven 插件,而子類(lèi)中重寫(xiě)的 clean() 模擬的是插件目標(biāo)。插件的本意就是插拔式的,用了添加不用不添加。
雖然示例中的代碼與 Maven 實(shí)際代碼相去甚遠(yuǎn),但它們的基本理念是方法相同的。生命周期抽象了構(gòu)建的各個(gè)步驟,定義了它們的執(zhí)行順序,但卻沒(méi)有提供具體的實(shí)現(xiàn)。插件中完成了對(duì)構(gòu)建過(guò)程的實(shí)現(xiàn),想要完成某個(gè)構(gòu)建步驟, 調(diào)用插件中的一個(gè)或多個(gè)插件目標(biāo)即可。
2、maven的三套生命周期
Maven 的生命周期并非只有一套,而是有三套, 并且這三套生命周期之間是沒(méi)有關(guān)系的
。一套生命周期包含很多個(gè)不同的階段,這些不同的階段是有順序的,有些階段必須要在某個(gè)階段完成之后,才能進(jìn)行。Maven 的三套生命周期分別為:clean(清理),default(默認(rèn)),site(站點(diǎn))。接下來(lái)我們就一一介紹一下這三個(gè)生命周期。
clean:用于清理項(xiàng)目,clean 生命周期包括以下 3 個(gè)階段:
- pre-clean: 清理前的準(zhǔn)備工作;
- clean:清理上一次構(gòu)建的結(jié)果;
- post-clean:清理結(jié)束后需要完成的工作。
default:default 生命周期定義了項(xiàng)目真正構(gòu)建時(shí)所需要的所有步驟,它是所有生命周期中最核心,最重要的部分。
default 生命周期包含非常多的階段,如下表:
site:sit 生命周期的目的是建立和部署項(xiàng)目站點(diǎn),Maven 能夠根據(jù) POM 包含的信息,自動(dòng)生成一個(gè)友好的站點(diǎn),該站點(diǎn)包含一些與該項(xiàng)目相關(guān)的文檔。
site 生命周期包含以下 4 個(gè)階段:
- pre-site:準(zhǔn)備階段。在生成站點(diǎn)前所需要做的工作;
- site:生成站點(diǎn)階段;
- post-site:結(jié)束階段。生成站點(diǎn)結(jié)束后所需要做的工作;
- site-deploy:發(fā)布階段。我們可以將上面生成的站點(diǎn)發(fā)布到對(duì)應(yīng)服務(wù)器中。
3、生命周期執(zhí)行規(guī)則
每套生命周期包含一系列的構(gòu)建階段(phase),這些階段是有順序的,且后面的階段依賴于前面的階段。用戶與 Maven 最直接的交互方式就是調(diào)用這些生命周期階段。
以 clean 生命周期為例,它包含 pre-clean、clean 以及 post-clean 三個(gè)階段,當(dāng)用戶調(diào)用 pre-clean 階段時(shí),則只有 pre-clean 階段執(zhí)行;當(dāng)用戶調(diào)用 clean 階段時(shí),pre-clean 和 clean 階段都會(huì)執(zhí)行。當(dāng)用戶調(diào)用 post-clean 階段時(shí),則 pre-clean、clean 以及 post-clean 三個(gè)階段都會(huì)執(zhí)行。
三套生命周期本身是相互獨(dú)立的,用戶可以只調(diào)用 clean 生命周期的某個(gè)階段,也可以只調(diào)用 default 生命周期的某個(gè)階段,而不會(huì)對(duì)其他生命周期造成任何影響。當(dāng)然也可以同時(shí)調(diào)用兩套生命周期的某個(gè)階段。
通過(guò)將階段名傳遞給 mvn 命令,就可以調(diào)用構(gòu)建階段,例如: mvn clean
,就是調(diào)用clean生命周期的clean階段,當(dāng)前項(xiàng)目的target目錄會(huì)被清空。
我們?cè)囍鴪?zhí)行 Maven 的打包命令: mvn package -DskipTests
(-DskipTests是跳過(guò)測(cè)試的意思,假如不跳過(guò)測(cè)試,他在打包的時(shí)候會(huì)自動(dòng)執(zhí)行項(xiàng)目test目錄下帶有@Test注解的方法)。就是調(diào)用default生命周期的package 階段,執(zhí)行完成之后,可以看到其所經(jīng)過(guò)的生命周期。因此,當(dāng)我們想要構(gòu)建項(xiàng)目的時(shí)候,并不需要分別執(zhí)行 package 階段之前的階段,而是 Maven 自動(dòng)為我們執(zhí)行。突然發(fā)現(xiàn),原來(lái)構(gòu)建項(xiàng)目是如此的簡(jiǎn)單,方便。
生命周期中的每個(gè)構(gòu)建過(guò)程都可以綁定一個(gè)或多個(gè)插件目標(biāo)
,且 Maven 為大多數(shù)的構(gòu)建步驟都綁定了默認(rèn)的插件。例如,針對(duì)源代碼編譯的插件是 maven-compiler-plugin、針對(duì)集成測(cè)試的插件是 maven-surefire-plugin 等(關(guān)于這一點(diǎn)后面會(huì)細(xì)說(shuō))。
同時(shí)我們也可以執(zhí)行兩套生命周期,例如調(diào)用clean生命周期的clean階段再加上default生命周期的package階段: mvn clean package -DskipTests
二、Maven插件(plugin)
1、兩種類(lèi)型的插件
Maven 實(shí)際上是一個(gè)依賴插件執(zhí)行的框架
,它執(zhí)行的每個(gè)任務(wù)實(shí)際上都由插件完成的。使用Maven打出來(lái)的包并不包含任何 Maven 插件,它們以獨(dú)立構(gòu)件的形式存在, 只有在 Maven 需要使用某個(gè)插件時(shí),才會(huì)去倉(cāng)庫(kù)中下載。
如下表所示,Maven 提供了如下 2 種類(lèi)型的插件:
2、調(diào)用插件有兩種方式
插件目標(biāo): 對(duì)于 Maven 插件而言,為了提高代碼的復(fù)用性,通常一個(gè) Maven 插件能夠?qū)崿F(xiàn)多個(gè)功能,每一個(gè)功能都是一個(gè)插件目標(biāo),即 Maven 插件是插件目標(biāo)的集合。我們可以把插件理解為一個(gè)類(lèi),而插件目標(biāo)是類(lèi)中的方法,調(diào)用插件目標(biāo)就能實(shí)現(xiàn)對(duì)應(yīng)的功能。
使用的兩種方式:
引入到項(xiàng)目當(dāng)中,然后將插件綁定到指定的生命周期,然后執(zhí)行聲明周期命令會(huì)自動(dòng)調(diào)用該插件,例如: mvn clean、mvn install
通過(guò)如下命令可以直接調(diào)用插件。
- 使用 Maven 命令執(zhí)行插件的目標(biāo),語(yǔ)法如:
mvn [插件名]:[目標(biāo)名]
- 例如,調(diào)用 maven-compiler-plugin 插件的 compile 目標(biāo),命令如:
mvn compiler:compile
(注意不能使用插件的全名,一定是縮寫(xiě)名,不然會(huì)報(bào)找不到插件)
插件綁定: 為了完成某個(gè)具體的構(gòu)建任務(wù), Maven 生命周期的階段需要和 Maven 插件的目標(biāo)相互綁定
。例如,代碼編譯任務(wù)對(duì)應(yīng)了default 生命周期的 compile 階段,而 maven-compiler-plugin 插件的 compile 目標(biāo)能夠完成這個(gè)任務(wù),因此將它們進(jìn)行綁定就能達(dá)到代碼編譯的目的。
3、內(nèi)置綁定
Maven 默認(rèn)為一些核心的生命周期階段綁定了插件目標(biāo),當(dāng)用戶調(diào)用這些階段時(shí),對(duì)應(yīng)的插件目標(biāo)就會(huì)自動(dòng)執(zhí)行相應(yīng)的任務(wù)。
表中,default 生命周期中只列出了綁定了插件目標(biāo)的階段,它還有很多其他的階段,但這些階段默認(rèn)沒(méi)有綁定任何插件目標(biāo),因此它們也沒(méi)有任何實(shí)際的行為。
我們可以直接在執(zhí)行 Maven 命令看到該構(gòu)建過(guò)程包含了哪些插件目標(biāo)。例如,在 Maven 項(xiàng)目中執(zhí)行 mvn clean install
命令,能看到如下輸出,圖中標(biāo)記的部分就是執(zhí)行此命令時(shí)所調(diào)用的插件目標(biāo)。
像這些內(nèi)置綁定的插件我們也可以在項(xiàng)目當(dāng)中去顯示的聲明然后修改配置,這時(shí)候內(nèi)置綁定插件的默認(rèn)配置將會(huì)被覆蓋!
4、自定義綁定插件
除了內(nèi)置綁定之外,用戶也可以自己選擇將某個(gè)插件目標(biāo)綁定到 Maven 生命周期的某個(gè)階段上,這種綁定方式就是自定義綁定。自定義綁定能夠讓 Maven 在構(gòu)建過(guò)程中執(zhí)行更多更豐富的任務(wù)。
例如,我們想要在 clean 生命周期的 clean 階段中顯示自定義文本信息,則只需要在項(xiàng)目的 POM 中 ,通過(guò) build 元素的子元素 plugins,將
maven-antrun-plugin插件的run 目標(biāo)
綁定到clean
階段上,并使用該插件輸出自定義文本信息即可。
<build> <plugins> <!-- 綁定插件 maven-antrun-plugin --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-antrun-plugin</artifactId> <version>3.0.0</version> <executions> <execution> <!--自定義 id --> <id>custom clean</id> <!--插件目標(biāo)綁定的構(gòu)建階段 --> <phase>clean</phase> <!--插件目標(biāo) --> <goals> <goal>run</goal> </goals> <!--配置 --> <configuration> <!-- 執(zhí)行的任務(wù) --> <target> <!--自定義文本信息 --> <echo message="清理階段"/> </target> </configuration> </execution> </executions> </plugin> </plugins> </build>
以上配置中除了插件的坐標(biāo)信息之外,還通過(guò) executions 元素定義了一些執(zhí)行配置。executions 下的每一個(gè) executin 子元素都可以用來(lái)配置執(zhí)行一個(gè)任務(wù)。execution 下各個(gè)元素含義如下:
- id:任務(wù)的唯一標(biāo)識(shí)。
- phase:插件目標(biāo)需要綁定的生命周期階段。
- goals:用于指定一組插件目標(biāo),其子元素 goal 用于指定一個(gè)插件目標(biāo)。
- configuration:該任務(wù)的配置,其子元素 tasks 用于指定該插件目標(biāo)執(zhí)行的任務(wù)。
執(zhí)行命令 mvn clean ,結(jié)果如下:
以上我們只是簡(jiǎn)單使用maven-antrun-plugin插件的run目標(biāo)綁定到了clean階段打印了一段文字,實(shí)際我們還可以通過(guò)該插件來(lái)完成一些特殊工作,例如打包過(guò)后自動(dòng)將包上傳到指定位置等等…這里就不細(xì)說(shuō)了。
插件的運(yùn)行順序: 當(dāng)插件目標(biāo)綁定到生命周期的不同階段時(shí),其執(zhí)行順序由生命周期階段的先后順序決定。如果多個(gè)目標(biāo)綁定到同一個(gè)生命周期階段,其執(zhí)行順序與插件聲明順序一致,先聲明的先執(zhí)行,后聲明的后執(zhí)行。
三、官網(wǎng)查找插件
官網(wǎng):https://maven.apache.org/plugins/index.html
這里就拿maven-antrun-plugin插件來(lái)說(shuō),首先打開(kāi)官網(wǎng)然后搜索antrun,如下:
點(diǎn)擊antrun進(jìn)來(lái)以后看到如下:
點(diǎn)擊目標(biāo)進(jìn)來(lái)以后可以看到該插件可配置的標(biāo)簽:
注意:光看標(biāo)簽有時(shí)候根本不知道怎么用,盡量配合著用法示例來(lái)使用。
點(diǎn)擊 Using <target/> Attributes
用法示例如下:
并不是所有的插件都是maven開(kāi)發(fā)的,還有一些其他公司進(jìn)行開(kāi)發(fā)的,如下:
到此這篇關(guān)于Maven中生命周期的具體使用的文章就介紹到這了,更多相關(guān)Maven 生命周期內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot自動(dòng)初始化數(shù)據(jù)庫(kù)的方法分享
我們?cè)陧?xiàng)目中應(yīng)該經(jīng)常遇到過(guò)初始化數(shù)據(jù)的場(chǎng)景,特別是項(xiàng)目部署或者交付的時(shí)候,那么有什么方式可以在項(xiàng)目啟動(dòng)的時(shí)候自動(dòng)初始化數(shù)據(jù)庫(kù)呢,下面小編就來(lái)和大家分享幾個(gè)方法吧2023-08-08Java靜態(tài)內(nèi)部類(lèi)實(shí)現(xiàn)單例過(guò)程
這篇文章主要介紹了Java靜態(tài)內(nèi)部類(lèi)實(shí)現(xiàn)單例過(guò)程,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-10-10java.util.Random和concurrent.ThreadLocalRandom使用對(duì)比
這篇文章主要介紹了java.util.Random和concurrent.ThreadLocalRandom使用對(duì)比,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07Spring AOP定義AfterReturning增加實(shí)例分析
這篇文章主要介紹了Spring AOP定義AfterReturning增加,結(jié)合實(shí)例形式分析了Spring面相切面AOP定義AfterReturning增加相關(guān)操作技巧與使用注意事項(xiàng),需要的朋友可以參考下2020-01-01SpringBoot自定義對(duì)象參數(shù)實(shí)現(xiàn)自動(dòng)類(lèi)型轉(zhuǎn)換與格式化
SpringBoot 通過(guò)自定義對(duì)象參數(shù),可以實(shí)現(xiàn)自動(dòng)類(lèi)型轉(zhuǎn)換與格式化,并可以級(jí)聯(lián)封裝,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧2022-09-09itext生成PDF設(shè)置頁(yè)眉頁(yè)腳的實(shí)例詳解
這篇文章主要介紹了itext生成PDF設(shè)置頁(yè)眉頁(yè)腳的實(shí)例詳解的相關(guān)資料,希望通過(guò)本文能幫助到大家,需要的朋友可以參考下2017-09-09Java老手該當(dāng)心的13個(gè)錯(cuò)誤
這篇文章主要介紹了Java老手該當(dāng)心的13個(gè)錯(cuò)誤,需要的朋友可以參考下2015-04-04