- 輕量級Java EE企業應用開發實戰
- 柳偉衛編著
- 2388字
- 2022-07-29 14:31:15
2.2 理解Maven構建生命周期
構建生命周期是Maven的核心概念。這意味著構建和分發特定工件(項目)的過程將會被明確定義。
對于構建項目的人員,這意味著只需要學習一小堆命令即可構建任何Maven項目,POM將確保他們獲得所需的結果。
有3個內置的生命周期:default、clean和site。在default生命周期處理項目部署,在clean生命周期處理項目的清理,而在site生命周期處理項目站點文檔的創建。
2.2.1 Maven階段
構建生命周期是由階段組成的。例如,default生命周期包括以下階段:
- validate:驗證項目是否正確并且所有必要的信息均可用。
- compile:編譯項目的源代碼。
- test:使用合適的單元測試框架測試已編譯的源代碼。這些測試不應要求將代碼打包或部署。
- package:采用編譯后的代碼并將其打包為可分發格式,例如JAR。
- integration-test:處理程序包并將其部署到可以運行集成測試的環境中。
- verify:運行任何檢查以驗證包裝是否有效并符合質量標準。
- install:將軟件包安裝到本地存儲庫中,以作為本地其他項目中的依賴項。
- deploy:在集成或發布環境中完成,將最終程序包復制到遠程存儲庫,以便與其他開發人員和項目共享。
這些生命周期階段依次執行,以完成默認生命周期。給定上述生命周期階段,這意味著當使用默認生命周期時,Maven將首先驗證項目,然后嘗試編譯源代碼,運行這些源代碼,打包二進制文件(例如JAR),運行集成測試軟件包,驗證集成測試,將驗證的軟件包安裝到本地存儲庫,然后將安裝的軟件包部署到遠程存儲庫。
換句話說,在生命周期里面階段是連續的,在不出錯的前提下,比如執行打包(Package)時就一定是執行了測試(Test)之后再執行。
2.2.2 完整的生命周期階段
下面列出了clean、default和site生命周期所有的階段。
1.clean生命周期
- pre-clean:執行實際項目清理之前所需的流程。
- clean:刪除以前構建生成的所有文件。
- post-clean:執行完成項目清理所需的流程。
2.default生命周期
- validate:驗證項目是正確的,所有必要的信息可用。
- initialize:初始化構建狀態,例如設置屬性或創建目錄。
- generate-sources:生成包含在編譯中的任何源代碼。
- process-sources:處理源代碼,例如過濾任何值。
- generate-resources:生成包含在包中的資源。
- process-resources:將資源復制并處理到目標目錄中,準備打包。
- compile:編譯項目的源代碼。
- process-classes:編譯后處理生成的文件,例如對Java類進行字節碼增強。
- generate-test-sources:生成包含在編譯中的任何測試源代碼。
- process-test-sources:處理測試源代碼,例如過濾任何值。
- generate-test-resources:創建測試資源。
- process-test-resources:將資源復制并處理到測試目標目錄中。
- test-compile:將測試源代碼編譯到測試目標目錄中。
- process-test-classes:測試編譯中處理生成的文件,例如對Java類進行字節碼增強。
- test:使用合適的單元測試框架運行測試。這些測試不應該要求代碼被打包或部署。
- prepare-package:在實際打包之前執行必要的準備操作。
- package:將編譯的代碼,以可分發的格式(如JAR)進行打包。
- pre-integration-test:在執行集成測試之前,執行必要的準備操作,諸如設置所需環境等。
- integration-test:如果需要,可以將該包部署到可以運行集成測試的環境中。
- post-integration-test:執行集成測試后執行所需的操作,可能包括清理環境。
- verify:運行任何檢查以驗證包裝是否有效并符合質量標準。
- install:將軟件包安裝到本地存儲庫中,以作為本地其他項目的依賴關系。
- deploy:在集成或發布環境中完成,將最終軟件包復制到遠程存儲庫,以與其他開發人員和項目共享。
3.site生命周期
- pre-site:在實際的項目現場生成之前執行所需的進程。
- site:生成項目的站點文檔。
- post-site:執行完成站點生成所需的進程,并準備站點部署。
- site-deploy:將生成的站點文檔部署到指定的Web服務器。
2.2.3 生命周期階段在命令行中的調用
在開發環境中,使用以下命令來執行構建并將工件安裝到本地存儲庫中:
mvn install
此命令在執行安裝之前按順序執行validate、compile、package等每個默認生命周期階段。在這種情況下,只需要調用最后一個構建階段install即可。
在構建環境中,使用以下命令來將工件清理并部署到共享存儲庫中。
mvn clean deploy
相同的命令可以在多模塊場景(具有一個或多個子項目的項目)中使用。Maven遍歷每個子項目并執行clean,然后執行deploy(包括之前所有構建階段的步驟)。
注意
在開發階段,有一些生命周期的階段(比如validate)基本很少用到,使用關鍵的幾個階段就基本能滿足需求。
2.2.4 使用構建生命周期來設置項目
構建生命周期足夠簡單,但是當需要為項目配置Maven構建時,如何將任務分配到每個構建階段呢?
1.打包
第一種也是常見的方法是通過同樣命名的POM元素<packaging>為項目設置打包。一些有效的打包值是JAR、WAR、EAR和POM。如果沒有指定包裝值,就默認為JAR。
每個不同類型的打包都包含要綁定到特定階段的目標列表。例如打包值是JAR,將綁定表2-1所示的目標來構建默認生命周期的階段。
表2-1 打包值是JAR所綁定的目標

可以這么理解,階段列是簡化的命令,插件:目標列是詳細的插件加目標(命令行參數)的形式。需要注意的是,Maven都是以插件的形式存在的,包括生命周期的階段也是一個個不同的插件組成的,比如compile階段就是由compiler插件提供的,其中compile為這個插件的目標,也可以說是插件的命令行參數。
不同的打包方式所要綁定的階段是不同的。例如,純粹的元數據(打包值是POM)的項目只將目標綁定到install和deploy階段。
注意,對于某些可用的打包類型,可能還需要在POM的<build>部分包含一個特定的插件,并為該插件指定<extensions>true</extensions>。需要這種插件的一個例子是Plexus插件,它提供plexus-application和plexus-service打包。
2.插件
將目標添加到階段的第二種方法是在項目中配置插件。插件是為Maven提供目標的工件。此外,插件可以具有一個或多個目標,其中每個目標代表該插件的能力。例如,compiler插件有兩個目標:compile和testCompile。前者編譯主代碼的源代碼,后者編譯測試代碼的源代碼。
插件可以包含指示將目標綁定到的生命周期階段的信息。注意,只添加插件是不夠的,還必須要指定目標。如果有多個目標綁定到特定階段,則使用的順序是首先執行來自打包的順序,然后才是在POM中配置順序。注意,可以使用<executions>元素來獲得對特定目標的順序更多的控制。
例如,Modello插件默認將目標modello:java綁定到generate-sources階段(注意:modello:java目標生成Java源代碼)。因此,要使用Modello插件,從模型生成的源代碼并將其合并到構建中,配置如下:

現在,在modello:java的情況下,它只在generate-sources階段才有意義。但是一些目標可以在多個階段中使用。例如,假設有一個目標display:time,希望它在process-test-resources階段運行時開始執行,則可以被配置如下:

- Learning LibGDX Game Development(Second Edition)
- JavaScript前端開發模塊化教程
- Instant Testing with CasperJS
- Spring Cloud Alibaba核心技術與實戰案例
- Modular Programming with Python
- UML和模式應用(原書第3版)
- Hands-On Data Structures and Algorithms with JavaScript
- Django Design Patterns and Best Practices
- Java開發入行真功夫
- Essential Angular
- C++程序設計基礎教程
- 深入淺出Serverless:技術原理與應用實踐
- Android系統級深入開發
- SQL Server 入門很輕松(微課超值版)
- 軟件再工程:優化現有軟件系統的方法與最佳實踐