Maven 實際上是一個依賴插件執行的框架,它執行的每個任務實際上都由插件完成的。Maven 的核心發布包中並不包含任何 Maven 插件,它們以獨立構件的形式存在, 只有在 Maven 需要使用某個插件時,才會去倉庫中下載。
如下表所示,Maven 提供了如下 2 種類型的插件。
插件類型 | 描述 |
---|---|
Build plugins | 在項目構建過程中執行,在 pom.xml 中的 build 元素中配置 |
Reporting plugins | 在網站生成過程中執行,在 pom.xml 中的 reporting 元素中配置 |
插件目標
對於 Maven 插件而言,為了提高代碼的復用性,通常一個 Maven 插件能夠實現多個功能,每一個功能都是一個插件目標,即 Maven 插件是插件目標的集合。我們可以把插件理解為一個類,而插件目標是類中的方法,調用插件目標就能實現對應的功能。
通用寫法
插件目標的通用寫法如下。
[插件名]:[插件目標名]
例如,maven-compiler-plugin 插件的 compile 目標的通用寫法如下。
maven-compiler-plugin:compile
執行插件目標
使用 Maven 命令執行插件的目標,語法如下。
mvn [插件名]:[目標名]
例如,調用 maven-compiler-plugin 插件的 compile 目標,命令如下。
mvn compiler:compile
插件綁定
為了完成某個具體的構建任務,Maven 生命周期的階段需要和 Maven 插件的目標相互綁定。例如,代碼編譯任務對應了default 生命周期的 compile 階段,而 maven-compiler-plugin 插件的 compile 目標能夠完成這個任務,因此將它們進行綁定就能達到代碼編譯的目的。
內置綁定
Maven 默認為一些核心的生命周期階段綁定了插件目標,當用戶調用這些階段時,對應的插件目標就會自動執行相應的任務。
生命周期 | 階段 | 插件目標 | 執行的任務 |
---|---|---|---|
clean | pre-clean | ||
clean | maven-clean-plugin:clean | 清理 Maven 的輸出目錄 | |
post-clean | |||
site | pre-site | ||
site | maven-site-plugin:site | 生成項目站點 | |
post-site | |||
site-deploy | maven-site-plugin:deploy | 部署項目站點 | |
default | process-resources | maven-resources-plugin:resources | 復制資源文件到輸出目錄 |
compile | maven-compiler-plugin:compile | 編譯代碼到輸出目錄 | |
process-test-resources | maven-resources-plugin:testResources | 復制測試資源文件到測試輸出目錄 | |
test-compile | maven-compiler-plugin:testCompile | 編譯測試代碼到測試輸出目錄 | |
test | maven-surefire-plugin:test | 執行測試用例 | |
package | maven-jar-plugin:jar/maven-jar-plugin:war | 創建項目 jar/war 包 | |
install | maven-install-plugin:install | 將項目輸出的包文件安裝到本地倉庫 | |
deploy | maven-deploy-plugin:deploy | 將項目輸出的包文件部署到到遠程倉庫 |
上表中,default 生命周期中只列出了綁定了插件目標的階段,它還有很多其他的階段,但這些階段默認沒有綁定任何插件目標,因此它們也沒有任何實際的行為。
我們可以直接在執行 Maven 命令看到該構建過程包含了哪些插件目標。例如,在 Maven 項目中執行 mvn clean install 命令,能看到如下輸出,圖中標記的部分就是執行此命令時所調用的插件目標。
圖1:Maven 構建過程中執行插件目標
自定義綁定
除了內置綁定之外,用戶也可以自己選擇將某個插件目標綁定到 Maven 生命周期的某個階段上,這種綁定方式就是自定義綁定。自定義綁定能夠讓 Maven 在構建過程中執行更多更豐富的任務。
例如,我們想要在 clean 生命周期的 clean 階段中顯示自定義文本信息,則只需要在項目的 POM 中 ,通過 build 元素的子元素 plugins,將 maven-antrun-plugin:run 目標綁定到 clean 階段上,並使用該插件輸出自定義文本信息即可。
<project> ... <build> <plugins> <!-- 綁定插件 maven-antrun-plugin --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-antrun-plugin</artifactId> <version>1.8</version> <executions> <execution> <!--自定義 id --> <id>www.biancheng.net clean</id> <!--插件目標綁定的構建階段 --> <phase>clean</phase> <!--插件目標 --> <goals> <goal>run</goal> </goals> <!--配置 --> <configuration> <!-- 執行的任務 --> <tasks> <!--自定義文本信息 --> <echo>清理階段,編程幫 歡迎您的到來,網址:www.biancheng.net</echo> </tasks> </configuration> </execution> </executions> </plugin> </plugins> </build> ... </project>
以上配置中除了插件的坐標信息之外,還通過 executions 元素定義了一些執行配置。executions 下的每一個 executin 子元素都可以用來配置執行一個任務。
execution 下各個元素含義如下:
- id:任務的唯一標識。
- phase:插件目標需要綁定的生命周期階段。
- goals:用於指定一組插件目標,其子元素 goal 用於指定一個插件目標。
- configuration:該任務的配置,其子元素 tasks 用於指定該插件目標執行的任務。
執行命令 mvn clean ,結果如下。

[INFO] Scanning for projects... [INFO] [INFO] ------------------< net.biancheng.www:helloIdeaMaven >------------------ [INFO] Building helloIdeaMaven 2.6-SNAPSHOT [INFO] --------------------------------[ jar ]--------------------------------- [INFO] [INFO] --- maven-clean-plugin:3.1.0:clean (default-clean) @ helloIdeaMaven --- [INFO] Deleting D:\eclipse workSpace 3\helloIdeaMaven\target [INFO] [INFO] --- maven-antrun-plugin:1.8:run (www.biancheng.net clean) @ helloIdeaMaven --- [WARNING] Parameter tasks is deprecated, use target instead [INFO] Executing tasks main: [echo] 清理階段,編程幫 歡迎您的到來,網址:www.biancheng.net [INFO] Executed tasks [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 0.753 s [INFO] Finished at: 2021-04-08T10:22:49+08:00 [INFO] ------------------------------------------------------------------------
當插件目標綁定到生命周期的不同階段時,其執行順序由生命周期階段的先后順序決定。
如果多個目標綁定到同一個生命周期階段,其執行順序與插件聲明順序一致,先聲明的先執行,后聲明的后執行。