跟着官方文檔學Maven構建生命周期


在IntelliJ IDEA中,顯示了Maven的Lifecycle:

image-20210620235453707

只需要學習這些命令,就能構建一個Maven項目。

三個內置生命周期

Maven內置了三個生命周期:clean、default和site。生命周期是由多個順序執行的階段組成,它們的關系和說明如下:

clean

清理文件。

  • pre-clean clean前置階段
  • clean 移除上次構建生成的所有文件
  • post-clean clean后置階段

default

主要生命周期,用來構建應用。

  • validate 驗證項目正確,必要信息有效
  • initialize 初始化構建狀態,比如設置屬性或創建目錄
  • generate-sources 生成編譯的源代碼
  • process-sources 處理源代碼,比如過濾任意值
  • generate-resources 生成包中的資源文件
  • process-resources 復制和處理資源文件到目標目錄,為打開做准備
  • compile 編譯項目的源碼
  • process-classes 后處理(post-process)編譯源代碼生成的文件,比如給Java class文件做bytecode enhancement
  • generate-test-sources 生成編譯的測試代碼
  • process-test-sources 處理測試代碼,比如過濾任意值
  • generate-test-resources 創建測試需要的資源
  • process-test-resources 復制和處理資源文件到測試目錄
  • test-compile 編譯測試代碼到測試目錄
  • process-test-classes 后處理(post-process)編譯測試代碼生成的文件,比如給Java class文件做bytecode enhancement
  • test 使用單元測試框架(如JUnit)執行測試,這些測試不能依賴已經打包(packaged)或部署(deployed)的代碼
  • prepare-package 打包前准備,一般會生成處理過的未打包的前置版本包
  • package 將編譯后的代碼進行打包,比如jar包、war包
  • pre-integration-test 集成測試前置階段,比如創建環境
  • integration-test 集成測試,在環境中進行測試
  • post-integration-test 集成測試后置階段,比如清理環境
  • verify 驗證包有效且質量達標
  • install 安裝包到本地倉庫,以便於本地項目依賴
  • deploy 復制包到遠程倉庫,共享給其他人使用

site

一般用來創建文檔。

  • pre-site 前置階段
  • site 生成項目的網站文檔
  • post-site 后置階段
  • site-deploy 把生成的網站文檔部署到web服務器

命令行執行

Maven提供了一個mvn命令,把它的路徑(如D:\Program Files\JetBrains\IntelliJ IDEA 2020.3.3\plugins\maven\lib\maven3\bin)添加到環境變量就能直接使用。

  • mvn verify 如果不知道執行什么命令,可以執行這條命令,它會把前置命令都執行了:validate,compile,test,package。同時也會執行代碼檢查比如checkstyle,以及集成測試。
  • mvn clean deploy 常用來清理構建部署到倉庫,如果項目有多個子模塊,Maven會遍歷所有模塊執行。

對於pre-*, post-*, process-*等短橫線命名的階段則不能使用命令行直接執行,它們主要用來生成中間結果。比如單元測試覆蓋率工具Jacoco和執行容器插件Docker可能會綁定到pre-integration-test來准備集成測試環境,然后在post-integration-test來收集覆蓋率統計或者銷毀容器。Failsafe和Code coverage插件綁定到了integration-testverify兩個階段,在verify執行后生成測試報告。如果執行verify是沒有問題的,但是如果直接執行integration-test,就可能導致無法生成測試報告,甚至集成測試環境也沒有被徹底清理。

IntelliJ IDEA集成了所有沒有短橫線命名的這些可以直接執行的命令。

Plugin Goals

Maven除了生命周期的階段,還提供了一個更精細的任務,叫做插件目標(Plugin Goals)。示例:

mvn clean dependency:copy-dependencies package

dependency:copy-dependencies就是一個插件目標,表達式為plugin:goal

其實階段都是由插件目標組成的,Maven默認進行了綁定,比如clean:cleancompiler:compiledeploy:deploy等。package階段打包類型不同插件目標也有區別:jar:jarwar:war

一個典型的打jar包的階段和插件目標如下圖所示:

image-20210626123346245

Plugin

Plugin是用來給Maven提供goals的,比如Compiler plugin包括2個goals:compile用來編譯main源代碼,testCompile用來編譯測試代碼。Plugin在pom.xml中進行配置,比如:

<project xmlns="http://maven.apache.org/POM/4.0.0"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
  http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.companyname.projectgroup</groupId>
<artifactId>project</artifactId>
<version>1.0</version>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.1</version>
<executions>
   <execution>
      <id>id.validate</id>
      <phase>validate</phase>
      <goals>
         <goal>run</goal>
      </goals>
      <configuration>
         <tasks>
            <echo>validate phase</echo>
         </tasks>
      </configuration>
   </execution>
   <execution>
      <id>id.compile</id>
      <phase>compile</phase>
      <goals>
         <goal>run</goal>
      </goals>
      <configuration>
         <tasks>
            <echo>compile phase</echo>
         </tasks>
      </configuration>
   </execution>
   <execution>
      <id>id.test</id>
      <phase>test</phase>
      <goals>
         <goal>run</goal>
      </goals>
      <configuration>
         <tasks>
            <echo>test phase</echo>
         </tasks>
      </configuration>
   </execution>
   <execution>
         <id>id.package</id>
         <phase>package</phase>
         <goals>
            <goal>run</goal>
         </goals>
         <configuration>
         <tasks>
            <echo>package phase</echo>
         </tasks>
      </configuration>
   </execution>
   <execution>
      <id>id.deploy</id>
      <phase>deploy</phase>
      <goals>
         <goal>run</goal>
      </goals>
      <configuration>
      <tasks>
         <echo>deploy phase</echo>
      </tasks>
      </configuration>
   </execution>
</executions>
</plugin>
</plugins>
</build>
</project>

多個goals按配置的先后順序運行。executions用來對goals進行配置,也可以添加id進行標識。

實際的配置會復雜許多,可以參考開源項目:

https://github.com/metersphere/metersphere

https://github.com/macrozheng/mall

小結

本文介紹了Maven內置的三個生命周期,生命周期是由多個階段組成,IntelliJ IDEA集成了所有沒有短橫線命名的這些可以直接執行的階段。階段是由階段目標(Plugin Goals)構成的,在pom.xml中進行配置。pom.xml是Maven一個很重要很常用的文件。

參考資料:

https://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html

https://www.runoob.com/maven/maven-build-life-cycle.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM