在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