Maven學習筆記(五)——生命週期與插件

生命週期定義

Maven的生命週期就是爲了對所有的構建過程進行統一和抽象。這個生命週期包括項目的清理、初始化、編譯、測試、打包、集成測試、部署和站點生成等幾乎所有的構建步驟。幾乎所有項目的構建,都能映射到這樣一個生命週期上。
Maven的生命週期是抽象的,這意味着生命週期本身不做任何實際的工作,在Maven的設計中,實際的任務都由插件來完成。這種思想與設計模式的模板方法相似。
Maven的生命週期和插件機制一方面保證了所有Maven項目有一致的構建標準,另一方面又通過默認插件簡化和穩定了實際項目的構建。此外,該機制還提供了足夠的擴展空間,用戶可以通過配置現有插件或者自行編寫插件來自定義構建行爲。

生命週期詳解

三套生命週期

Maven擁有三套獨立的生命週期,分別是clean、default和site。clean生命週期的目的是清理項目,default生命週期的目的是構建項目,site生命週期的目的是建立項目站點。
每個生命週期包含一些階段,這些階段是有順序的,並且後面的階段依賴於前面的階段,用戶和Maven最直接的方式就是調用這些生命週期階段。
生命週期前後階段具有依賴關係,但三套生命週期本身是相互獨立的。

clean生命週期

clean生命週期的目的是清理項目,它包含三個階段:

  • pre-clean執行一些清理前需要完成的工作
  • clean清理上一次構建生成的文件
  • post-clean執行一些清理後需要完成的工作

default生命週期

default生命週期定義了真正構建時所需要執行的所有步驟,它是所有生命週期中最核心的部分,其部分主要階段如下:

  • process-sources 處理項目主資源文件。一般是對src/main/resources目錄的內容進行變量替換等工作後,複製到項目輸出的主classpath目錄中
  • compile 編譯項目的主源碼。一般是編譯src/main/java目錄下的Java文件到項目輸出的主classpath目錄中
  • process-test-sources 處理項目測試資源文件。一般是對src/test/resources目錄的內容進行變量替換等工作後,複製到項目輸出的測試classpath目錄中
  • test-compile 編譯項目的測試代碼。一般是編譯src/test/java目錄下的Java文件到項目輸出的測試classpath目錄中
  • test使用單元測試框架運行測試,測試代碼不會被打包或部署
  • install將包安裝到Maven本地倉庫,供本地其他Maven項目使用
  • deploy將最終的包安裝到遠程倉庫,供其他開發人員和Maven項目使用

site生命週期

site生命週期的目的是建立和發佈項目站點,Maven能夠基於POM所包含的信息,自動生成一個友好的站點,方便團隊交流和發佈項目信息,包含以下階段:

  • pre-site 執行一些生成項目站點之前需要完成的工作
  • site 生成項目站點文檔
  • post-site 執行一些在生成項目站點之後需要完成的工作
  • site-deploy 將生成的站點項目發佈的服務器上

命令行與生命週期

從命令行執行Maven任務的最主要的方式就是調用Maven的生命週期階段。下面介紹一些常見的Maven命令與其執行的生命週期:

  • mvn clean:該命令調用clean生命週期的clean階段
  • mvn test:該命令調用default生命週期的test階段
  • mvn clean install:該命令調用clean生命週期的clean階段和default生命週期的install階段
  • mvn clean install site-deploy:該命令調用clean生命週期的clean階段,default生命週期的deploy階段,以及site生命週期的site-deploy階段

插件目標

對於插件本身,爲了能夠複用代碼,它往往能夠完成多個任務。爲每個功能寫一個獨立的插件顯然是不可取的,因爲這些任務背後有很多的可以複用的代碼,因此,這些功能聚集在一個插件裏,每個功能就是一個插件目標。

插件綁定

Maven生命週期與插件相互綁定,用以完成實際的構建任務。具體是生命週期階段與插件目標的相互綁定,以完成某個具體的構建任務。

內置綁定

default生命週期內置插件綁定關係及具體任務如下:
在這裏插入圖片描述

自定義綁定

用戶可以自己選擇將某個插件目標綁定到生命週期的某個階段上,這種自定義綁定方式能讓Maven項目在構件過程中執行更多更有特色的任務。

插件配置

用戶可以配置插件目標的參數,進一步調整插件目標所執行的任務,以滿足項目的需求。

命令行插件配置

可以在Maven命令中使用-D參數,並伴隨一個參數鍵=參數值的形式,來配置插件目標的參數。

POM中插件全局配置

有的參數的值從項目創建到項目發佈都不會改變,或者很少改變,對於這種情況,在POM文件中一次性配置就顯然比重複在命令行中輸入要方便。

POM中插件任務配置

可以爲某個插件任務配置特定的參數

獲取插件信息

在線插件信息

基本上所有主要的Maven插件都來自Apache和Codehaus。

使用maven-help-plugin描述插件

從命令行調用插件

可以通過mvn命令激活生命週期階段,從而執行那些綁定在生命週期階段上的插件目標。但Maven還支持直接從命令行調用插件目標,Maven支持這種方式是因爲有些任務不適合綁定在生命週期上。

插件解析機制

插件倉庫

與依賴構件一樣,插件構件同樣基於座標存儲在Maven倉庫中。但Maven會區別對待依賴的遠程倉庫與插件的遠程倉庫,當Maven需要的依賴在本地倉庫不存在時,它會去配置的遠程倉庫查找,可是當Maven需要的插件在本地倉庫不存在時,它不會去遠程倉庫尋找。

插件默認的groupId

在POM中配置插件時,如果該插件時Maven的官方插件,就可以省略groupId配置。
但並不推薦這麼做,因爲這樣可能讓其他人感到費解。

解析插件版本

在用戶沒有提供插件版本的情況下,Maven會自動解析插件版本。
Maven在超級POM中爲所有核心插件設定了版本,超級POM是所有Maven項目的父POM,所有項目都繼承這個超級POM的配置。因此即使用戶不加任何配置,Maven使用核心插件的時候,它們的版本就已經確定了。
如果用戶使用某個插件時沒有設定版本,而這個插件又不屬於核心插件,Maven就會去檢查所有倉庫中可用的版本,然後做出選擇。
依賴Maven解析插件版本是不推薦度的做法,會有潛在的不穩定性。推薦應一直顯式地設定版本,這也解釋了爲什麼Maven要在超級POM中爲核心插件設定版本。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章