官术网_书友最值得收藏!

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階段運行時開始執行,則可以被配置如下:

主站蜘蛛池模板: 东安县| 福海县| 平乡县| 余干县| 孙吴县| 祁连县| 柳州市| 大洼县| 霍城县| 商丘市| 通州市| 泾源县| 宁南县| 东台市| 龙川县| 杂多县| 神池县| 利津县| 三台县| 丰宁| 安阳市| 清苑县| 金华市| 万源市| 陵水| 丽水市| 南川市| 毕节市| 清涧县| 光山县| 江油市| 来宾市| 同心县| 城固县| 宁蒗| 东乌珠穆沁旗| 嵊州市| 乌拉特中旗| 栾川县| 西峡县| 华安县|