Maven插件(plugin)


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] ------------------------------------------------------------------------
View Code
當插件目標綁定到生命周期的不同階段時,其執行順序由生命周期階段的先后順序決定。

如果多個目標綁定到同一個生命周期階段,其執行順序與插件聲明順序一致,先聲明的先執行,后聲明的后執行


免責聲明!

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



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