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