跟著官方文件學Maven構建生命週期

自動化程式碼美學發表於2021-06-28

在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

相關文章