Maven實戰學習筆記、7.生命週期和插件

     除了座標、依賴以及倉庫之外,Maven另外兩個核心概念是生命週期和插件。在有關Maven的日常使用中,命令行的輸入往往對應了生命週期,如mvn package就表示

執行默認生命週期階段package。Maven的生命週期是抽象的,其實際行爲都由插件來完成,如package階段的任務可能就會由maven-jar-plugin完成。生命週期和插件

兩者協同工作,密不可分,本章對它們進行深入介紹。

7.1 何爲生命週期

     在Maven出現之前,項目構建的生命週期就已經存在,軟件開發人員每天都在對項目進行清理、編譯、測試及部署、雖然大家都在不停地做構建工作,但公司和公司
間、項目和項目間、往往使用不同的方式做類似的工作。有的項目以手工的方式在執行編譯測試,有的項目寫了自動化腳本執行編譯測試。可以想象的是,雖然各種手
工方式十分雷士,但不可能完全一樣;同樣地,對於自動化腳本,大家也是各寫各的,能滿足自身需求即可,換個項目就需要重頭再來。
    Maven的生命週期就是爲了對所有的構件過程進行抽象和統一。Maven從大量項目和構建工具中學習和反思,然後總結了一套高度完善的,易擴展的生命週期。這個
生命週期包含了項目的清理、初始化、編譯、測試、打包、繼承測試、驗證、部署和站點生成等幾乎所有的構建步驟。也就是說,幾乎所有項目的構建,都能映射到
這樣一個生命週期上。
       Maven的生命週期是抽象的,這意味着生命週期本身不做任何實際的工作,在Maven的設計中,實際的任務(如編譯源代碼)都交由插件來完成。這種思想和設計
模式中的模板方法非常相似。模板方法時在父類中定義算法的整體結構,子類可以通過實現或者重寫父類的方法來控制實際的行爲,這樣既保證了算法有足夠的可擴
展性,又能嚴格控制算法的整體結構。
public abstract class MavenBuild {
    public  void build(){
    	initialize();
    	compile();
    	test();
    	packagee();
    	integrationTest();
    	deploy();
    }
    
    protected abstract void initialize();
    
    protected abstract void compile();
    
    protected abstract void test();
    
    protected abstract void packagee();
    
    protected abstract void integrationTest();
    
    protected abstract void deploy();
}
   雖然上面的代碼的Maven實際的代碼相去甚遠,Maven的生命週期包含更多的步驟和更復雜的邏輯,但它們的基本概念是相同的。生命週期抽象了構建的各個步驟,定義了
它們的次序,但沒有提供具體的實現。那麼誰來實現呢,也不能讓用戶重新寫一套實現的代碼。Maven必須考慮到這一點,因爲它設計了插件機制。每個構建步驟都可以綁定
多個插件行爲,Maven爲大多數構建步驟編寫並綁定了默認插件,例如:針對編譯的插件有maven-compiler-plugin,針對測試的插件有maven-surefire-plugin等。雖然在大
多數時間裏,用戶幾乎都不會察覺到插件的存在,但實際上編譯是由maven-complier-plugin完成的,而測試是由maven-surefire-plugin完成的,當用戶特殊需要的時候,也
可以配置插件定製構件行爲,甚至自己編寫插件。
   編譯-測試-打包-部署。
Maven定義的生命週期和插件機制一方面保證了所有Maven項目一致的構建標準,另一方面又通過默認插件簡化和穩定了實際項目的構建,此外,該機制還提供了足夠的發展空間,用戶可以通過配置現有插件或自行編寫插件來自定義構建行爲。

7.1 生命週期詳解

    到目前爲止,本書只是介紹了Maven生命週期背後的指導思想,要想熟練的使用maven,還必須詳細瞭解其生命週期的具體定義和使用方式。

7.1.2 三套生命週期

    初學者往往會以爲Maven的生命週期是一個整體,其實不然,Maven擁有三套相互獨立的生命週期,它們分別爲clean、default和site。clean生命週期的目的是清理
項目,default生命週期的目的是構建項目,而site生命週期的目的是建立項目站點。
     每個生命週期包含一些階段(phase),這些階段是有順序的,並且後面的階段依賴於前面的階段,用戶與Maven最直接的交互方式就是調用這些生命週期的生命階段。
以clean生命週期爲例,它包含的階段有pre-clean、clean和post-clean。當用戶調用pre-clean的時候,只有pre-clean執行;當用戶調用clean的時候,pre-clean和clean
階段會得以順序執行;當用戶調用post-clean的時候,pre-clean、clean和post-clean會得以順序執行。
    較之於生命週期階段的前後依賴關係,三套生命週期本身是相互獨立的,用戶可以僅僅調用clean生命週期的某個階段,或者僅僅調用default生命週期的某個階段,而
不會對其他生命週期產生任何影響。例如,當用戶調用clean生命週期的clean階段的時候,不會觸發default生命週期的任何階段,反之亦然,當用戶調用default生命週期
的compile階段的時候,也不會觸發clean生命週期的任何階段。

7.2.2 clean生命週期

    clean生命週期的目的是清理項目,它包含三個階段:
1)pre-clean 執行一些清理前需要完成的工作。
2)clean清理上一次構件生成的文件
3)post-clean 執行一些清理後需要完成的工作。

7.2.3 default生命週期

    default生命週期定義了真正構件時所需要執行的所有步驟,它是所有生命週期中最核心的部分,其包含的階段如下,這裏筆者只對重要的階段進行解釋。
validate
initialize
generate-sources
process-sources    處理項目主資源文件。一般來說,是對src/main/resources目錄的內容進行變量替換等工作後,複製到項目輸出的主classpath目錄中。
genrate-resources
process-resources
compile 編譯項目的主源碼,一般來說,是編譯src/main/java 目錄的java文件至項目輸出的主classpath目錄後。
process-classes
generate-test-sources
process-test-sources 處理項目測試資源文件。一般來說,是對src/test/resources/目標的內容進行變量替換等工作後,複製到項目輸出的測試classpath目錄中。
test-compile 編譯項目的測試代碼,一般來說,是編譯java/test/java 目錄下的java文件至項目輸出的測試classpath目錄中。
process-test-classes
test 使用單元測試框架運行測試,測試代碼不會被打包或部署。
prepare-package
package 接受編譯好的代碼,打包成可發佈的格式,如jar。
pre-integration-test
integration-test
post-integration-test
verify
install  將包安裝到Maven本地倉庫,供本地其他Maven項目使用。
deploy  將最終的包複製到遠程倉庫,供其他開發人員和Maven項目使用。
    對於上述未加解釋的階段,讀者也能夠大致重名字中猜測到其用途,若想了解進這些階段的詳細信息,可以參閱官方的解釋:
http://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html

7.2.4 site生命週期

    site生命週期的目的是建立和發佈項目站點,Maven能夠基於POM所包含的信息,自動生成一個友好的站點,方便團隊交流和發佈項目信息。
pre-site
site
post-site
site-deploy將生成的項目站點發布到服務器上。

7.2.5 命令行與生命週期

      從命令行執行Maven任務的最主要方式就是調用Maven的生命週期階段。需要注意的是各個生命週期之間是相互獨立的。而一個生命週期階段
是有前後依賴關係的。下面是常見的Maven命令。
$mvn clean
$mvn test
$mvn clean install 該命令調用clean生命週期的clean階段和default生命週期的install階段。
$mvn clean deploy site-deploy:該命令調用clean生命週期的clean階段、default生命週期的deploy階段,以及site生命週期的site-deploy階段。
    由於Maven中主要的生命週期階段並不多,而常用的Maven命令實際都是基於這些階段簡單組合而成的,因此只對Maven生命週期有一個基本的理解,
讀者就可以正面而熟練地使用Maven命令。











發佈了124 篇原創文章 · 獲贊 32 · 訪問量 67萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章