Maven百科 - 項目構建中的生命週期與插件管理

Road Map

1 Maven 中的三套生命週期

    在maven中,實際上是有三套相互獨立的生命週期(Lifecycle),而不是咱們覺得的一套生命週期,準確地來講,在maven的世界,它有本身的一套生命週期管理的技術體系,在這套體系中,maven爲咱們定義了三套互相不影響的生命週期。它們分別是clean,default和site。 其中clean 和default最爲經常使用了。java

     此外呢,每套生命週期 都有若干個生命週期階段(phase)。其中每套生命週期中的階段都依賴於前一個階段,以 clean 生命週期爲例。 clean 生命週期 它包含了 三個階段,pre-clean, clean, post-clean.    Clean 依賴與pre-clean, post-clean依賴與clean,也就是說,當咱們執行clean 階段的時候, pre-clean 也會被執行。apache

    下面會詳細介紹下三套生命週期服務器

1.1 Clean 生命週期

    clean 生命週期的目的是情理項目,它包含了三個階段:併發

  1.      pre-clean 執行一次清理前須要完成的工做maven

  2.      clean 執行清理工做post

  3.      post-clean 執行一些清理後要完成的工做測試

1.2 Default 生命週期

    default 生命週期定義了真正構建時所須要執行的全部的步驟,它是全部生命週期中最核心的部分,它包括以下的階段ui

生命週期階段 描述
validate 驗證項目是否正確,以及全部爲了完整構建必要的信息。
initialize  
generate-sources 生成全部須要包含在編譯過程當中的源代碼
process-sources 處理源代碼
generate-resources 生成所須要的包含在打包過程當中的資源文件
process-resources 處理項目主資源文件。通常來講,是對src/main/resources目錄的內容進行變量替換等工做後,複製到項目輸出的主classpath目錄中
compile 編譯項目的主源碼。通常來講,是編譯src/main/java目錄下的Java文件至項目輸出的主classpath目錄中
 process-classes 處理編譯生成的文件 如.class文件
generate-test-sources

生成全部包含在測試編譯過程當中的測試源碼spa

process-test-sources

處理測試源碼插件

generate-test-resources

生成廁所須要的資源文件

process-test-resources

複製並處理測試次元文件到測試目標目錄

test-compile

編譯測試代碼

process-test-classes

處理 編譯測試文件

test

執行測試

prepare-package

在真正打包以前,執行一些準備打包的必要操做

package

將編譯好的代碼打包成須要的格式

pre-integration-test

執行一些在集成測試前的須要動做

integration-test

處理包併發布到集成測試環境

post-integration-test

執行一些在集成測試運行以後須要的動做

verify

執行全部檢查,驗證包是否有效

 install

安裝包至本地倉庫

 deploy

複製包到遠程倉庫,共享給其餘開發人員和項目

    

 

1.3 Site 生命週期

    Site 生命週期的目的是創建和發佈項目站點,Maven 可以基於 POM所包含的信息,自動生成一個友好的站點,方便團隊交流和發佈信息。它包含了以下4個階段

  1.     pre-site 執行項目生成前的工做

  2.     site 生成項目站點文檔

  3.     post-site 執行生成站點後的工做

  4.     site-deploy 將生成的項目站點發布到服務器上

1.4 命令行與生命週期

    從maven的命令行中,能夠看出 執行maven 任務最主要的方式 就是調用maven的生命週期階段。須要注意的是,這三套生命週期,是相互獨立的,只有在同一個生命週期裏面的階段 具備依賴關係。

    以 mvn test 爲例,該命令調用defaul生命週期的test階段。實際執行的階段爲default生命週期的 validate,initialize等

直到test的全部階段。這也解釋了在執行測試的時候,項目源代碼也會獲得編譯。

 

2 插件管理

2.1 插件目標(plugin goal)

     Maven 定義了抽象的生命週期,具體的任務是由插件完成的,插件以獨立的構件形式存在,所以,Maven自己並不大,在實際應用中會下載不少插件。

    插件自己而言,爲了可以複用代碼,每每可以完成多個任務。因此針對每一個任務單獨寫一個插件,顯得過於浪費,或者使得插件庫過於龐大,所以maven就將每一個功能設定成目標。

    如 maven-dependency-plugin有十幾個目標,每一個目標對應一個功能。

mvn dependency:analyze
mvn dependency:tree
mvn dependency:list

2.2 插件綁定

    Maven的生命週期與插件相互綁定,用以完成實際的構建任務。具體而言,生命週期的階段與插件的目標相互綁定,完成某個具體的構建任務。

2.3 內置綁定

    Maven 默認給生命週期的各階段綁定了內置的一些插件目標,方便用戶。當經過maven命令執行生命週期的時候,會找到對應的綁定的插件目標,完成相應的任務

生命週期階段 插件
pre-clean maven-clean-plugin:clean
clean maven-clean-plugin:clean
post-clean maven-clean-plugin:clean
process-resources maven-resources-plugin:resources
compile maven-compiler-plugin:compile
process-test-resources

maven-resources-plugin:testResources

test-compile

maven-compiler-plugin:testCompile

test

maven-surefire-plugin:test

package

maven-jar-plugin:jar

 install

maven-deploy-plugin:install

 deploy

maven-deploy-plugin:deploy

pre-site maven-site-plugin:site
site maven-site-plugin:site
post-site maven-site-plugin:site
site-deploy maven-site-plugin:deploy

2.4 自定義綁定

除了內置綁定之外,用戶還可以選擇將某個插件目標綁定到生命週期的某個階段上

<build>
    <plugins>
         <plugin>
             <groupId>org.apache.maven.plugins</groupId>
             <artifactId>maven-source-plugin</artifactId>
             <version>2.1.1></version>
             <execution>
                 <id>attach-sources</id>
                 <phase>verify</phase>
                 <goals>
                      <goal>jar-no-fork</goal>
                 </goals>
              </execution>
          </plugin>
     </plugins>
</build>

2.5 插件配置

    插件不是固定執行,能夠經過傳遞一些參數,進一步調正任務執行

2.5.1 命令行插件配置

在命令行執行任務的時候能夠經過 -D參數 並伴隨一個鍵值對,來配置插件目標參數

mvn install -Dmaven.test.skip=true

2.5.2 POM插件全局配置

     並非全部插件的參數 都適合在命令行配置,MAVEN提供了在pom配置文件裏面配置全局的配置.

    在pom裏面生命插件的時候 能夠在節點 <configuration>下面配置對應的參數

<build>
    <plugins>
         <plugin>
             <groupId>org.apache.maven.plugins</groupId>
             <artifactId>maven-compiler-plugin</artifactId>
             <version>2.1</version>
             <configuration>
                 <source>1.6</source>
                 <target>1.6</target>
              </configuration>
          </plugin>
     </plugins>
</build>

2.5.3 POM插件任務配置

針對任務目標的配置也是能夠的

<build>
    <plugins>
         <plugin>
             <groupId>org.apache.maven.plugins</groupId>
             <artifactId>maven-source-plugin</artifactId>
             <version>2.1.1></version>
             <execution>
                 <id>attach-sources</id>
                 <phase>verify</phase>
                 <goals>
                      <goal>jar-no-fork</goal>
                 </goals>
                 <configuration>
                     <tasks>
                         <echo>I'm jar-no-fork</echo>
                     </tasks>
                 </configuration>
              </execution>
          </plugin>
     </plugins>
</build>
相關文章
相關標籤/搜索