在IntelliJ IDEA中,顯示了Maven的Lifecycle:
只需要學習這些命令,就能構建一個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-test
和verify
兩個階段,在verify
執行後生成測試報告。如果執行verify
是沒有問題的,但是如果直接執行integration-test
,就可能導致無法生成測試報告,甚至整合測試環境也沒有被徹底清理。
IntelliJ IDEA整合了所有沒有短橫線命名的這些可以直接執行的命令。
Plugin Goals
Maven除了生命週期的階段,還提供了一個更精細的任務,叫做外掛目標(Plugin Goals)。示例:
mvn clean dependency:copy-dependencies package
dependency:copy-dependencies
就是一個外掛目標,表示式為plugin:goal
。
其實階段都是由外掛目標組成的,Maven預設進行了繫結,比如clean:clean
、compiler:compile
、deploy:deploy
等。package階段打包型別不同外掛目標也有區別:jar:jar
、war:war
。
一個典型的打jar包的階段和外掛目標如下圖所示:
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進行標識。
實際的配置會複雜許多,可以參考開源專案:
小結
本文介紹了Maven內建的三個生命週期,生命週期是由多個階段組成,IntelliJ IDEA整合了所有沒有短橫線命名的這些可以直接執行的階段。階段是由階段目標(Plugin Goals)構成的,在pom.xml中進行配置。pom.xml是Maven一個很重要很常用的檔案。
參考資料:
https://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html