Maven中生命周期的具體使用
本篇文章重點(diǎn)針對(duì)這幾個(gè)問題進(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)存在,開發(fā)人員每天都在對(duì)項(xiàng)目進(jìn)行清理,編譯,測(cè)試及部署,但由于沒有統(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)建過程進(jìn)行了抽象和統(tǒng)一。
1、生命周期與插件的關(guān)系
Maven 生命周期是抽象的,其本身不能做任何實(shí)際工作,這些實(shí)際工作(如源代碼編譯)都通過調(diào)用 Maven 插件 中的插件目標(biāo)(plugin goal)完成的。
為了更好的理解 Maven 生命周期、插件以及插件目標(biāo)三者的關(guān)系,我們可以 將 Maven 生命周期理解成一個(gè)抽象父類 , 將插件理解成其子類 , 將插件目標(biāo)理解成子類中重寫的方法 ,其基本結(jié)構(gòu)與下面的示例代碼相似。
/**
* 模擬 maven 生命周期
*/
public abstract class LifeCycle {
//定義構(gòu)建過程
public void build() {
//模擬生命周期各個(gè)階段,即調(diào)用插件中目標(biāo)
clean();
initialize();
compile();
packager();
install();
}
//定義清理的過程
public abstract void clean();
//定義初始化的過程
public abstract void initialize();
//定義編譯的過程
public abstract void compile();
//定義打包的過程
public abstract void packager();
//定義安裝的過程
public abstract void install();
}模擬 clean 插件的子類,代碼如下。
/**
* 子類模擬clean 相關(guān)的插件
*/
public abstract class CleanPlugin extends LifeCycle {
//重寫父類(生命周期)的清理工作
//模擬插件目標(biāo)
@Override
public void clean() {
System.out.println("清理");
}
}以上示例中,父類 LifeCycle 模擬的是 Maven 生命周期,子類 CleanPlugin 模擬的是 Maven 插件,而子類中重寫的 clean() 模擬的是插件目標(biāo)。插件的本意就是插拔式的,用了添加不用不添加。
雖然示例中的代碼與 Maven 實(shí)際代碼相去甚遠(yuǎn),但它們的基本理念是方法相同的。生命周期抽象了構(gòu)建的各個(gè)步驟,定義了它們的執(zhí)行順序,但卻沒有提供具體的實(shí)現(xiàn)。插件中完成了對(duì)構(gòu)建過程的實(shí)現(xiàn),想要完成某個(gè)構(gòu)建步驟, 調(diào)用插件中的一個(gè)或多個(gè)插件目標(biāo)即可。

2、maven的三套生命周期
Maven 的生命周期并非只有一套,而是有三套, 并且這三套生命周期之間是沒有關(guān)系的 。一套生命周期包含很多個(gè)不同的階段,這些不同的階段是有順序的,有些階段必須要在某個(gè)階段完成之后,才能進(jìn)行。Maven 的三套生命周期分別為:clean(清理),default(默認(rèn)),site(站點(diǎn))。接下來我們就一一介紹一下這三個(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è)階段。
通過將階段名傳遞給 mvn 命令,就可以調(diào)用構(gòu)建階段,例如: mvn clean ,就是調(diào)用clean生命周期的clean階段,當(dāng)前項(xiàng)目的target目錄會(huì)被清空。

我們?cè)囍鴪?zhí)行 Maven 的打包命令: mvn package -DskipTests (-DskipTests是跳過測(cè)試的意思,假如不跳過測(cè)試,他在打包的時(shí)候會(huì)自動(dòng)執(zhí)行項(xiàng)目test目錄下帶有@Test注解的方法)。就是調(diào)用default生命周期的package 階段,執(zhí)行完成之后,可以看到其所經(jīng)過的生命周期。因此,當(dāng)我們想要構(gòu)建項(xiàng)目的時(shí)候,并不需要分別執(zhí)行 package 階段之前的階段,而是 Maven 自動(dòng)為我們執(zhí)行。突然發(fā)現(xiàn),原來構(gòu)建項(xiàng)目是如此的簡(jiǎn)單,方便。
生命周期中的每個(gè)構(gòu)建過程都可以綁定一個(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ì)說)。

同時(shí)我們也可以執(zhí)行兩套生命周期,例如調(diào)用clean生命周期的clean階段再加上default生命周期的package階段: mvn clean package -DskipTests

二、Maven插件(plugin)
1、兩種類型的插件
Maven 實(shí)際上是一個(gè)依賴插件執(zhí)行的框架 ,它執(zhí)行的每個(gè)任務(wù)實(shí)際上都由插件完成的。使用Maven打出來的包并不包含任何 Maven 插件,它們以獨(dú)立構(gòu)件的形式存在, 只有在 Maven 需要使用某個(gè)插件時(shí),才會(huì)去倉(cāng)庫(kù)中下載。
如下表所示,Maven 提供了如下 2 種類型的插件:


2、調(diào)用插件有兩種方式
插件目標(biāo): 對(duì)于 Maven 插件而言,為了提高代碼的復(fù)用性,通常一個(gè) Maven 插件能夠?qū)崿F(xiàn)多個(gè)功能,每一個(gè)功能都是一個(gè)插件目標(biāo),即 Maven 插件是插件目標(biāo)的集合。我們可以把插件理解為一個(gè)類,而插件目標(biāo)是類中的方法,調(diào)用插件目標(biāo)就能實(shí)現(xiàn)對(duì)應(yīng)的功能。
使用的兩種方式:
引入到項(xiàng)目當(dāng)中,然后將插件綁定到指定的生命周期,然后執(zhí)行聲明周期命令會(huì)自動(dòng)調(diào)用該插件,例如: mvn clean、mvn install
通過如下命令可以直接調(diào)用插件。
- 使用 Maven 命令執(zhí)行插件的目標(biāo),語法如:
mvn [插件名]:[目標(biāo)名] - 例如,調(diào)用 maven-compiler-plugin 插件的 compile 目標(biāo),命令如:
mvn compiler:compile(注意不能使用插件的全名,一定是縮寫名,不然會(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)沒有綁定任何插件目標(biāo),因此它們也沒有任何實(shí)際的行為。

我們可以直接在執(zhí)行 Maven 命令看到該構(gòu)建過程包含了哪些插件目標(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)建過程中執(zhí)行更多更豐富的任務(wù)。
例如,我們想要在 clean 生命周期的 clean 階段中顯示自定義文本信息,則只需要在項(xiàng)目的 POM 中 ,通過 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)信息之外,還通過 executions 元素定義了一些執(zhí)行配置。executions 下的每一個(gè) executin 子元素都可以用來配置執(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í)際我們還可以通過該插件來完成一些特殊工作,例如打包過后自動(dòng)將包上傳到指定位置等等…這里就不細(xì)說了。
插件的運(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插件來說,首先打開官網(wǎng)然后搜索antrun,如下:

點(diǎn)擊antrun進(jìn)來以后看到如下:

點(diǎn)擊目標(biāo)進(jìn)來以后可以看到該插件可配置的標(biāo)簽:
注意:光看標(biāo)簽有時(shí)候根本不知道怎么用,盡量配合著用法示例來使用。

點(diǎn)擊 Using <target/> Attributes用法示例如下:

并不是所有的插件都是maven開發(fā)的,還有一些其他公司進(jìn)行開發(fā)的,如下:

到此這篇關(guān)于Maven中生命周期的具體使用的文章就介紹到這了,更多相關(guān)Maven 生命周期內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring Boot詳解各類請(qǐng)求和響應(yīng)的處理方法
平時(shí)只是在用SpringBoot框架,但并沒有詳細(xì)研究過請(qǐng)求和響應(yīng)執(zhí)行的一個(gè)具體過程,所以本文主要來梳理一下SpringBoot請(qǐng)求和響應(yīng)的處理過程2022-07-07
Java?KeyGenerator.generateKey的19個(gè)方法代碼示例
在下文中一共展示了KeyGenerator.generateKey方法的19個(gè)代碼示例,這些例子默認(rèn)根據(jù)受歡迎程度排序2021-12-12
Spring Boot之FilterRegistrationBean-自定義Filter詳解
這篇文章主要介紹了Spring Boot之FilterRegistrationBean-自定義Filter詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08
探究springboot中的TomcatMetricsBinder
springboot的TomcatMetricsBinder主要是接收ApplicationStartedEvent然后創(chuàng)建TomcatMetrics執(zhí)行bindTo進(jìn)行注冊(cè),TomcatMetrics主要注冊(cè)了globalRequest、servlet、cache、threadPool、session相關(guān)的指標(biāo),本文給大家介紹的非常詳細(xì),需要的朋友參考下吧2023-11-11
Java ReentrantLock的可重入性與公平鎖機(jī)制詳解
這篇文章主要介紹了Java ReentrantLock的可重入性與公平鎖機(jī)制,Java中的ReentrantLock是一個(gè)可重入的互斥鎖,基于AQS實(shí)現(xiàn),它允許同一線程多次獲取同一把鎖,并控制加鎖與釋放,支持公平/非公平策略及tryLock等靈活特性,需要的朋友可以參考下2026-02-02
詳解Spring Cloud Gateway修改請(qǐng)求和響應(yīng)body的內(nèi)容
這篇文章主要介紹了Spring Cloud Gateway修改請(qǐng)求和響應(yīng)body的內(nèi)容的相關(guān)資料,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-09-09
Java mutable對(duì)象和immutable對(duì)象的區(qū)別說明
這篇文章主要介紹了Java mutable對(duì)象和immutable對(duì)象的區(qū)別,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06

