理解Maven生命週期和插件詳情

       早在Maven出現之前,項目構建的生命週期就已經存在了,軟件開發人員每天都對項目進行清理、編譯、測試和部署。通過Maven更加方便管理項目的各個生命週期。Maven本質是一個插件框架,本身並不執行任何構建任務,所有的工作都是交給插件來完成的。熟練使用Maven插件,可以讓我們的開發工作事半功倍

一、maven生命週期和插件關係

        生命週期和插件是Maven的兩個核心概念,Maven的生命週期是抽象的,其實際行爲都由插件來完成。Maven的生命週期是爲了對所有的構建過程進行抽象和統一。Maven從大量的項目和構建工具中學習和反思,然後總結了一套高度完善、易拓展的生命週期。這個生命週期包括了清理、初始化、編譯、測試、打包、集成測試、驗證、部署和站點生成等幾乎所有的構建步驟。

     每個生命週期中都包含着一系列的階段(phase)。這些 phase 就相當於 Maven 提供的統一的接口,然後這些 phase 的實現由 Maven 的插件來完成。每個階段(phase)會掛接一到多個goal。goal是maven裏定義任務的最小單元。

lifecycle是總任務,phase就是總任務分出來的一個個子任務,但是這些子任務是被規格化的,它可以同時被多個lifecycle所包含,一個lifecycle可以包含任意個phase,phase的執行是按順序的,一個phase可以綁定很多個goal,至少爲一個,沒有goal的phase是沒有意義的

這是執行任務的最小單元,它可以綁定到任意個phase中,一個phase有一個或多個goal,goal也是按順序執行的,一個phase被執行時,綁定到phase裏的goal會按綁定的時間被順序執行,不管phase己經綁定了多少個goal,你自己定義的goal都可以繼續綁到phase中

我們在輸入 mvn 命令的時候 比如 mvn clean,clean 對應的就是 Clean 生命週期中的 clean 階段。但是 clean 的具體操作是 maven-clean-plugin 裏面的clean goal 被執行。

二、maven生命週期

        Maven擁有三套相互獨立的生命週期,他們分別是clean,default 和site。clean生命週期的目的是清理項目,default生命週期的目的是構建項目,而site生命週期的目的是建立項目站點。

  • clean生命週期
phase 描述
pre-clean 在實際項目清理之前執行所需的過程
clean 刪除上一個版本生成的所有文件
post-clean 執行完成項目清理所需的過程
  • default生命週期的phase又可以分爲:
phase 描述
validate 驗證項目是否正確,並提供所有必要信息。
initialize 初始化構建狀態,例如設置屬性或創建目錄。
compile 編譯項目的源代
test 使用合適的單元測試框架運行測試。這些測試不應要求打包或部署代碼。
package 獲取已編譯的代碼並將其打包爲可分發的格式,例如JAR。
verify 運行任何檢查以驗證包是否有效並符合質量標準。
install 將軟件包安裝到本地存儲庫中,以便在本地用作其他項目的依賴項。
deploy 在集成或發佈環境中完成,將最終包複製到遠程存儲庫以與其他開發人員和項目共享。
  • site生命週期
phase 描述
pre-site 在實際項目站點生成之前執行所需的過程
site 生成項目的站點文檔
post-site 執行完成站點生成所需的流程,並準備站點部署
site-deploy 將生成的站點文檔部署到指定的Web服務器

三、命令行與生命週期

     從命令行執行maven任務的最主要方式就是調用maven的生命週期階段。需要注意的是,各個生命週期是相互獨立的,而一個生命週期的階段是有前後依賴關係的。例子如下:
     1、$mvn clean :該命令調用clean生命週期的clean階段。實際執行的階段爲clean生命週期的pre-clean和clean階段。
     2、$mvn test:該命令調用default生命週期的test階段。實際調用的是default生命週期的validate、initialize等,直到test的所有階段。
     3、$mvn clean install:該命令調換用clean生命週期的clean階段和default生命週期的instal階段。

四、maven插件

clean插件maven-clean-plugin:2.5

       clean階段是獨立的一個階段,功能就是清除工程目前下的target目錄,對應的插件是 maven-clean-plugin:2.5,2.5是版本號,可以使用maven內置的插件,當然也可以自己在pom中配置

è¿éåå¾çæè¿°è¿éåå¾çæè¿°

resources插件maven-resources-plugin:2.6

resource插件的功能就是把項目需要的配置文件拷貝到指定的目當,默認是拷貝src\main\resources目錄下的件到classes目錄下,當然可以自己來配置源目錄和輸出目錄。resources插件一般不單獨執行,complie插件執行時會先調用resources插件。配置示例如下:

      <plugin>  
         <groupId>org.apache.maven.plugins</groupId>  
         <artifactId>maven-resources-plugin</artifactId>  
         <version>2.6</version>  
         <executions>  
           <execution>  
              <id>copy-resources</id>  
              <!-- 在default生命週期的 validate階段就執行resources插件的copy-resources目標 -->  
              <phase>validate</phase>  
              <goals>  
                <goal>copy-resources</goal>  
              </goals>  
              <configuration>  
              <!-- 指定resources插件處理資源文件到哪個目錄下 -->  
                 <outputDirectory>${project.build.outputDirectory}</outputDirectory>  
                  <!-- 也可以用下面這樣的方式(指定相對url的方式指定outputDirectory) <outputDirectory>target/classes</outputDirectory> -->  
                  <!-- 待處理的資源定義 -->  
                  <resources>  
                     <resource>  
                        <!-- 指定resources插件處理哪個目錄下的資源文件 -->  
                        <directory>src/main/${deploy.env}/applicationContext.xml</directory>  
                        <!-- 指定不需要處理的資源 <excludes> <exclude>WEB-INF/*.*</exclude> </excludes> -->  
                        <!-- 是否對待處理的資源開啓過濾模式 (resources插件的copy-resources目標也有資源過濾的功能,這裏配置的   
                        這個功能的效果跟<build><resources><resource>下配置的資源過濾是一樣的,只不過可能執行的階段不一樣, 這裏執行的階段是插件指定的validate階段,<build><resources><resource>下的配置將是在resources插件的resources目標執行時起作用(在process-resources階段)) -->  
                        <filtering>false</filtering>  
                     </resource>  
                  </resources>  
              </configuration>  
              <inherited></inherited>  
           </execution>  
         </executions>  
  
         </plugin>  

compile插件maven-compiler-plugin

compile插件執行時先調用resouces插件,功能就是把src\mainjava源碼編譯成字節碼生成class文件,並把編譯好的class文件輸出到target\classes目錄下。下面看執行結果:

è¿éåå¾çæè¿°

 è¿éåå¾çæè¿°

 單元測試所用插件surefire-maven-plugin

單元測試所用的compile和resources插件和主代碼是相同的,但執行的目標不行,目標testCompile和testResources是把src\test\java下的代碼編譯成字節碼輸出到target\test-classes,同時把src\test\resources下的配置文件拷貝到target\test-classes。看下面的輸出:
è¿éåå¾çæè¿°

 插件maven-surefire-plugin:2.12.4是執行單元測試類的,如果單測試不通行,構建會失敗,在編譯正式的項目時可以使用mvn -Dmaven.test.skip=true 來跳過測試類的編譯和運行過程。mvn test可以單獨執行,但是這個命令其實是包括了resources、compile、testResources、testCompile、test這幾個階段如上面所說。

 

發佈插件maven-install-plugin

發佈插件的功能就是把構建好的artifact部署到本地倉庫,還有一個deploy插件是將構建好的artifact部署到遠程倉庫。

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