Maven 構建生命週期

構建生命週期是什麼?

構建生命週期階段的目標是執行順序是一個良好定義的序列。
這裏使用一個例子,一個典型的 Maven 構建生命週期是由下列順序的階段:

階段

處理

描述

準備資源

資源複製

資源複製可以進行定製

編譯

執行編譯

源代碼編譯在此階段完成

包裝

打包

創建JAR/WAR包如在 pom.xml 中定義提及的包

安裝

安裝

這一階段在本地/遠程Maven倉庫安裝程序包

可用於註冊必須執行一個特定的階段之前或之後的目標,有之前處理和之後階段。
當 Maven 開始建立一個項目,它通過定義序列階段步驟和執行註冊的每個階段的目標。 Maven有以下三種標準的生命週期:

  • clean

  • default(或 build)

  • site

目標代表一個特定的任務,它有助於項目的建設和管理。可以被綁定到零個或多個生成階段。一個沒有綁定到任何構建階段的目標,它的構建生命週期可以直接調用執行。
執行的順序取決於目標和構建階段折調用順序。例如,考慮下面的命令。清理和打包(mvn clean)參數的構建階段,而 dependency:copy-dependencies package 是一個目標。

mvn clean dependency:copy-dependencies package

在這裏,清潔的階段,將首先執行,然後是依賴關係:複製依賴性的目標將被執行,並終於將執行包階段。

清潔生命週期

當我們執行命令 mvn clean 命令後,Maven 調用清潔的生命週期由以下幾個階段組成:

  • pre-clean

  • clean

  • post-clean

Maven 清潔目標(clean:clean)被綁定清潔乾淨的生命週期階段。clean:clean 目標刪除 build 目錄下的構建輸出。因此,當 mvn clean 命令執行時,Maven會刪除編譯目錄。

目標清潔生命週期在上述階段,我們可以自定義此行爲。
在下面的示例中,我們將附加 maven-antrun-plugin:run 對目標進行預清潔,清潔和清潔後這三個階段。這將使我們能夠調用的信息顯示清理生命週期的各個階段。
現在來創建了一個 pom.xml 文件在 C:\MVN\ 項目文件夾中,具體內容如下:


4.0.0
com.companyname.projectgroup
project
1.0


   
   org.apache.maven.plugins
   maven-antrun-plugin
   1.1
   
     
         id.pre-clean
         pre-clean
         
            run
         

         
           
               pre-clean phase
           

         

     

     
         id.clean
         clean
         
          run
         

         
           
               clean phase
           

         

     

     
         id.post-clean
         post-clean
         
            run
         

         
           
               post-clean phase
           

         

     

   

   



現在,打開命令控制檯,到該文件夾包含  pom.xml 並執行以下 mvn 命令。

C:\MVN\project>mvn post-clean

Maven將開始處理並顯示清理生命週期的所有階段。

[INFO] Scanning for projects...
[INFO] ------------------------------------------------------------------
[INFO] Building Unnamed - com.companyname.projectgroup:project:jar:1.0
[INFO] task-segment: [post-clean]
[INFO] ------------------------------------------------------------------
[INFO] [antrun:run {execution: id.pre-clean}]
[INFO] Executing tasks
[echo] pre-clean phase
[INFO] Executed tasks
[INFO] [clean:clean {execution: default-clean}]
[INFO] [antrun:run {execution: id.clean}]
[INFO] Executing tasks
[echo] clean phase
[INFO] Executed tasks
[INFO] [antrun:run {execution: id.post-clean}]
[INFO] Executing tasks
[echo] post-clean phase
[INFO] Executed tasks
[INFO] ------------------------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] ------------------------------------------------------------------
[INFO] Total time: < 1 second
[INFO] Finished at: Sat Jul 07 13:38:59 IST 2012
[INFO] Final Memory: 4M/44M
[INFO] ------------------------------------------------------------------

你可以嘗試調整 mvn 清潔命令,該命令將顯示清潔前什麼都不會被執行。

默認(或生成)生命週期

這是 Maven 主要的生命週期,用於構建應用程序。它有以下 23 個階段。

生命週期階段

描述

validate

驗證項目是否正確,並且所有必要的信息可用於完成構建過程

initialize

建立初始化狀態,例如設置屬性

generate-sources

產生任何的源代碼包含在編譯階段

process-sources

處理源代碼,例如,過濾器值

generate-resources

包含在包中產生的資源

process-resources

複製和處理資源到目標目錄,準備打包階段

compile

編譯該項目的源代碼

process-classes

從編譯生成的文件提交處理,例如:Java類的字節碼增強/優化

generate-test-sources

生成任何測試的源代碼包含在編譯階段

process-test-sources

處理測試源代碼,例如,過濾器任何值

test-compile

編譯測試源代碼到測試目標目錄

process-test-classes

處理測試代碼文件編譯生成的文件

test

運行測試使用合適的單元測試框架(JUnit)

prepare-package

執行必要的任何操作的實際打包之前準備一個包

package

提取編譯後的代碼,並在其分發格式打包,如JAR,WAR或EAR文件

pre-integration-test

完成執行集成測試之前所需操作。例如,設置所需的環境

integration-test

處理並在必要時部署軟件包到集成測試可以運行的環境

pre-integration-test

完成集成測試已全部執行後所需操作。例如,清理環境

verify

運行任何檢查,驗證包是有效的,符合質量審覈規定

install

將包安裝到本地存儲庫,它可以用作當地其他項目的依賴

deploy

複製最終的包到遠程倉庫與其他開發者和項目共享

有涉及到Maven 生命週期值得一提幾個重要概念:

  • 當一個階段是通過 Maven命令調用,例如:mvn compile,只有階段到達幷包括這個階段纔會被執行。

  • 不同的 Maven 目標綁定到 Maven生命週期的不同階段這是這取決於包類型(JAR/WAR/EAR)。

在下面的示例中,將附加 Maven 的 antrun 插件:運行目標構建生命週期的幾個階段。這將使我們能夠回顯的信息顯示生命週期的各個階段。
我們已經更新了在 C:\MVN\ 項目文件夾中的 pom.xml 文件。


4.0.0
com.companyname.projectgroup
project
1.0



org.apache.maven.plugins
maven-antrun-plugin
1.1

   
      id.validate
      validate
     
         run      

     
         
            validate phase
         

     

   

   
      id.compile
      compile
     
         run
     

     
         
            compile phase
         

     

   

   
      id.test
      test
     
         run
     

     
         
            test phase
         

     

   

   
         id.package
         package
         
            run
         

         
         
            package phase
         

     

   

   
      id.deploy
      deploy
     
         run
     

     
     
         deploy phase
     

     

   





現在,打開命令控制檯,進入包含 pom.xml 並執行以下 mvn 命令。

C:\MVN\project>mvn compile

編譯階段,Maven 將開始構建生命週期的階段處理並顯示。

[INFO] Scanning for projects...
[INFO] ------------------------------------------------------------------
[INFO] Building Unnamed - com.companyname.projectgroup:project:jar:1.0
[INFO] task-segment: [compile]
[INFO] ------------------------------------------------------------------
[INFO] [antrun:run {execution: id.validate}]
[INFO] Executing tasks
[echo] validate phase
[INFO] Executed tasks
[INFO] [resources:resources {execution: default-resources}]
[WARNING] Using platform encoding (Cp1252 actually) to copy filtered resources,
i.e. build is platform dependent!
[INFO] skip non existing resourceDirectory C:\MVN\project\src\main\resources
[INFO] [compiler:compile {execution: default-compile}]
[INFO] Nothing to compile - all classes are up to date
[INFO] [antrun:run {execution: id.compile}]
[INFO] Executing tasks
[echo] compile phase
[INFO] Executed tasks
[INFO] ------------------------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] ------------------------------------------------------------------
[INFO] Total time: 2 seconds
[INFO] Finished at: Sat Jul 07 20:18:25 IST 2012
[INFO] Final Memory: 7M/64M
[INFO] ------------------------------------------------------------------

網站的生命週期

Maven的網站插件通常用於創建新的文檔,創建報告,部署網站等。
階段

  • pre-site

  • site

  • post-site

  • site-deploy

在下面的示例中,我們將附加 maven-antrun-plugin:run 目標網站的生命週期的所有階段。這將使我們能夠調用短信顯示的生命週期的各個階段。
現在更新 pom.xml 文件在 C:\MVN\ 項目文件夾中。


4.0.0
com.companyname.projectgroup
project
1.0



org.apache.maven.plugins
maven-antrun-plugin
1.1
   
     
         id.pre-site
         pre-site
         
            run
         

         
           
               pre-site phase
           

         

     

     
         id.site
         site
         
         run
         

         
               site phase
           

         

     

     
         id.post-site
         post-site
         
            run
         

         
           
               post-site phase
           

         

     

     
         id.site-deploy
         site-deploy
         
            run
         

         
           
               site-deploy phase
           

         

     

   




打開命令控制檯,進入該文件夾包含 pom.xml 並執行以下 mvn 命令。

C:\MVN\project>mvn site

Maven將開始處理並顯示網站的生命週期階段的各個階段。

[INFO] Scanning for projects...
[INFO] ------------------------------------------------------------------
[INFO] Building Unnamed - com.companyname.projectgroup:project:jar:1.0
[INFO] task-segment: [site]
[INFO] ------------------------------------------------------------------
[INFO] [antrun:run {execution: id.pre-site}]
[INFO] Executing tasks
[echo] pre-site phase
[INFO] Executed tasks
[INFO] [site:site {execution: default-site}]
[INFO] Generating "About" report.
[INFO] Generating "Issue Tracking" report.
[INFO] Generating "Project Team" report.
[INFO] Generating "Dependencies" report.
[INFO] Generating "Project Plugins" report.
[INFO] Generating "Continuous Integration" report.
[INFO] Generating "Source Repository" report.
[INFO] Generating "Project License" report.
[INFO] Generating "Mailing Lists" report.
[INFO] Generating "Plugin Management" report.
[INFO] Generating "Project Summary" report.
[INFO] [antrun:run {execution: id.site}]
[INFO] Executing tasks
[echo] site phase
[INFO] Executed tasks
[INFO] ------------------------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] ------------------------------------------------------------------
[INFO] Total time: 3 seconds
[INFO] Finished at: Sat Jul 07 15:25:10 IST 2012
[INFO] Final Memory: 24M/149M
[INFO] -