maven生命週期和插件詳解

生命週期

什麼是生命週期? 

  maven的生命週期就是對全部的構建過程進行抽象和統一。maven從大量項目和構建工具中總結了一套高度完善的、易擴展的生命週期。這個生命週期包含項目的清理、初始化、編譯、測試、打包、集成測試、驗證、部署和站點生成等幾乎全部的構建步驟。Maven的生命週期是抽象的,其實際行爲都由插件來完成。Maven的生命週期是爲了對全部的構建過程進行抽象和統一。java

生命週期詳解:

三套生命週期

    Maven總共擁有三套相互獨立的生命週期,分別爲clean、default和site。clean生命週期的目的是清理項目,default生命週期的目的是構建項目,site目的是創建項目站點。每一個生命週期包含一些階段(phase),這些階段是有順序的,而且後面的階段依賴於前面的階段。react

clean生命週期git

  • pre-clean 執行一些清理前須要完成的工做。
  • clean 清理上一次構建生成的文件。
  • post-clean 執行一些清理後須要完成的工做。

經過命令行調用pre-clean的時候,只有pre-clean階段得以執行,當調用post-clean的時候,三個階段會按順序執行。github

 

default生命週期:web

default 包含的操做不少:spring

  • validate
  • initialize
  • generate-sources
  • process-sources 處理項目主資源文件。通常來講,是對src/main/resources目錄的內容進行變量替換等工做後,複製到項目輸出的主classpath目錄中。
  • generate-resources
  • process-resources
  • compile 編譯項目的主代碼。通常來講,是編譯src/main/java目錄下的Java文件至項目輸出的主classpath目錄中。
  • process-classes
  • generate-test-sources
  • process-test-sources 處理項目測試資源文件 src/main/resources。
  • generate-test-resources
  • test-compile 編譯項目的測試代碼。src/test/java。
  • process-test-classes
  • test 使用單元測試框架運行測試,測試代碼不會被打包或部署。
  • prepare-package
  • package 接受編譯好的代碼,打包成可發佈的格式,如jar。
  • pre-integration-test
  • integration-test
  • post-integration-test
  • verify
  • install 將包安裝到Maven本地倉庫,供本地其餘Maven項目使用。
  • deploy 將最終的包複製到遠程倉庫。

 

site生命週期apache

  • pre-site
  • site 生成項目站點文檔。
  • post-site 
  • site-deploy 將生成的項目站點發布到服務器上。

 

如何調用生命週期:

經過命令行調用maven的生命週期階段。各個生命週期相互獨立,而一個生命週期的階段是有先後依賴關係的。例如:json

 mvn clean 該命令執行的階段爲clean生命週期的pre-clean和clean階段。服務器

 mvn test 執行default生命週期的validate、initialize等,直到test的全部階段。mybatis

 mvn clean install 執行clean的pre-clean、clean,default的從validate到install的全部階段。

 

插件

插件目標(Plugin Goal):

    一個插件每每可以完成多個任務。例如maven-dependency-plugin,它可以基於項目依賴作不少事情,例如分析項目依賴,幫助找出全部已解析的依賴等等,每一個功能就是一個插件目標。用法是 <插件前綴:目標>。例如maven-dependency-plugin有十多個目標,最經常使用的:

mvn dependency:analyze

//執行結果:
[WARNING] Used undeclared dependencies found:
[WARNING]    org.springframework:spring-web:jar:5.0.4.RELEASE:compile
[WARNING]    org.springframework.boot:spring-boot-autoconfigure:jar:2.0.0.RELEASE:compile
[WARNING]    org.springframework:spring-tx:jar:5.0.4.RELEASE:compile
[WARNING]    org.springframework.boot:spring-boot:jar:2.0.0.RELEASE:compile
[WARNING] Unused declared dependencies found:
[WARNING]    com.alibaba:fastjson:jar:1.2.31:compile
[WARNING]    org.springframework.boot:spring-boot-starter-test:jar:2.0.0.RELEASE:test
[WARNING]    org.springframework.boot:spring-boot-starter-web:jar:2.0.0.RELEASE:compile
[WARNING]    org.mybatis.spring.boot:mybatis-spring-boot-starter:jar:1.3.0:compile
[WARNING]    com.google.guava:guava:jar:23.0:compile

Unused declared dependencies found即聲明瞭沒使用的依賴,經過這個插件,就能看到項目依賴的狀況。若是是由於繼承了父pom文件而致使無用依賴太多,那麼可使用dependencyManagement管理。 

 

插件綁定:

    Maven的生命週期與插件相互綁定,用以完成實際的構建任務。例如項目編譯這一任務,它對應了default生命週期的compile階段,而maven-compile-plugin這一插件的compile目標能完成該任務。所以,將它們綁定,就能實現編譯的目的。

 

內置綁定: 

  Maven在覈心爲一些主要的生命週期階段綁定了不少插件的目標,當用戶經過命令行調用生命週期階段的時候,對於的插件目標就會執行相應的任務。例如clean綁定maven-clean-plugin:clean。

  而default生命週期,因爲項目的打包類型會影響構建的具體過程,所以,default生命週期的階段與插件的目標綁定關係由項目打包類型所決定,經過POM中的packaging元素定義。最經常使用的打包類型是jar。如下是基於jar,default生命週期的內置插件綁定關係:

default生命週期還有不少其餘階段,默認它們沒有綁定任何插件,所以也沒有實際行爲。

咱們經過maven命令行的輸出能夠看到項目構建過程執行了那些插件目標,例如,執行 mvn clean install 命令,能夠看到以下輸出:

~/Desktop/github/reactive-demo/reactor(master*) » mvn clean install                                               yrw@Mac
[INFO] Scanning for projects...
[INFO] 
[INFO] --------------------< com.vgrazi.reactive:reactor >---------------------
[INFO] Building reactor 1.0.1-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO] 
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ reactor ---
[INFO] Deleting /Users/yrw/Desktop/github/reactive-demo/reactor/target
[INFO] 
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ reactor ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory /Users/yrw/Desktop/github/reactive-demo/reactor/src/main/resources
[INFO] 
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ reactor ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 6 source files to /Users/yrw/Desktop/github/reactive-demo/reactor/target/classes
[INFO] 
[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ reactor ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory /Users/yrw/Desktop/github/reactive-demo/reactor/src/test/resources
[INFO] 
[INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ reactor ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 1 source file to /Users/yrw/Desktop/github/reactive-demo/reactor/target/test-classes
[INFO] 
[INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ reactor ---
[INFO] 
[INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ reactor ---
[INFO] Building jar: /Users/yrw/Desktop/github/reactive-demo/reactor/target/reactor-1.0.1-SNAPSHOT.jar
[INFO] 
[INFO] --- maven-install-plugin:2.4:install (default-install) @ reactor ---
[INFO] Installing /Users/yrw/Desktop/github/reactive-demo/reactor/target/reactor-1.0.1-SNAPSHOT.jar to /Users/yrw/.m2/repository/com/vgrazi/reactive/reactor/1.0.1-SNAPSHOT/reactor-1.0.1-SNAPSHOT.jar
[INFO] Installing /Users/yrw/Desktop/github/reactive-demo/reactor/pom.xml to /Users/yrw/.m2/repository/com/vgrazi/reactive/reactor/1.0.1-SNAPSHOT/reactor-1.0.1-SNAPSHOT.pom
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 2.175 s
[INFO] Finished at: 2018-12-02T19:48:46+08:00
[INFO] ------------------------------------------------------------------------

經過以上日誌輸出,能夠看到,執行的插件目標依次爲:

maven-clean-plugin:clean

maven-resources-plugin:resources

maven-compile-plugin:compile

maven-resource-plugin:testResources

maven-compile-plugin:testConpile

maven-surefile-plugin:test

maven-jar-plugin:jar

maven-install-plugin:install

 

自定義綁定:

  除了內置綁定之外,用戶還可以本身選擇將某個插件目標綁定到生命週期的某個階段上。例如一個經常使用的插件 Maven Archetype Plugin,用戶經過這個插件能夠生成一個Maven項目的骨架,也能夠從一個現成的項目中生成模板。

一般的用法是使用 mvn archetype:create-from-project 指令生成模板。若是我正在編寫一個模板項目,我但願在打包的時候自動生成模板,那麼我能夠把這個目標綁定到default的package生命週期上,以下配置:

</plugins>
  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-archetype-plugin</artifactId>
    <version>3.0.1</version>
      <executions>
        <execution>
          <id>create-archetype</id>
          <phase>package</phase>
          <goals>
            <goal>create-from-project</goal>
          </goals>
        </execution>
     </executions>
    </plugin>
</plugins>

  在POM的build元素下的plugins子元素中聲明插件的使用,除了配置插件的座標聲明外,還有插件的執行配置,executeions下每一個execution子元素能夠用來配置執行一個任務。咱們配置了一個id爲create-archetype的任務,經過phrase配置,將其綁定到package生命週期階段上,再經過goals配置指定要執行的插件目標。

執行 mvn clean package 就能看到有如下輸出:

//......以上省略......

[INFO] --- maven-jar-plugin:3.0.2:jar (default-jar) @ demo ---
[INFO] Building jar: /Users/yrw/Desktop/github/demo/target/demo-1.0-SNAPSHOT.jar
[INFO] 
[INFO] >>> maven-archetype-plugin:3.0.1:create-from-project (create-archetype) > generate-sources @ demo >>>
[INFO] 
[INFO] <<< maven-archetype-plugin:3.0.1:create-from-project (create-archetype) < generate-sources @ demo <<<
[INFO] 
[INFO] 
[INFO] --- maven-archetype-plugin:3.0.1:create-from-project (create-archetype) @ demo ---
[INFO] Setting default groupId: com.yrw
[INFO] Setting default artifactId: demo
[INFO] Setting default version: 1.0-SNAPSHOT
[INFO] Setting default package: com.yrw.test
[INFO] Scanning for projects...
[INFO] 
[INFO] -----------------------< com.yrw:demo-archetype >-----------------------
[INFO] Building demo-archetype 1.0-SNAPSHOT
[INFO] --------------------------[ maven-archetype ]---------------------------
[INFO] 
[INFO] --- maven-resources-plugin:3.1.0:resources (default-resources) @ demo-archetype ---
[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] Copying 84 resources
[INFO] 
[INFO] --- maven-resources-plugin:3.1.0:testResources (default-testResources) @ demo-archetype ---
[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] Copying 2 resources
[INFO] 
[INFO] --- maven-archetype-plugin:3.0.1:jar (default-jar) @ demo-archetype ---
[INFO] Building archetype jar: /Users/yrw/Desktop/github/demo/target/generated-sources/archetype/target/demo-archetype-1.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1.110 s
[INFO] Finished at: 2018-11-23T22:12:15+08:00
[INFO] ------------------------------------------------------------------------
[INFO] Archetype project created in /Users/yrw/Desktop/github/demo/target/generated-sources/archetype
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 5.689 s
[INFO] Finished at: 2018-11-23T22:12:15+08:00
[INFO] ------------------------------------------------------------------------

能夠看到,在打包的時候執行了archetype:create-from-project,進入/target/generated-sources/archetype目錄,就能看到生成的模板了。

 

插件配置 

命令行配置插件:

    插件目標支持命令行配置,能夠經過-D參數,並伴隨一個參數=參數值的形式,來配置插件目標的參數。例如命令 mvn install -Dmaven.test.skip=true ,就會跳過執行測試。

 

在pom中配置全局插件:

  並非全部的插件參數都適合從命令行配置,有些參數的值從項目發佈都不會改變,對於這種狀況,能夠在pom文件中一次性配置。例如須要配置maven-compiler-plugin編譯java1.8.

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

這樣,無論綁定到compile階段的maven-compiler-plugin:compile任務,仍是綁定到test-compiler階段的maven-compiler-plugin:testCompiler任務,就都可以使用該配置,基於1.8版本進行編譯。

相關文章
相關標籤/搜索