不會開發Maven外掛(plugin)?我來幫你梳理內容

前言

Maven是現在最流行的專案管理工具,同時Maven的外掛也給我們提供了非常多的便利,本次我就給大家將一下Maven是如何進行自定義外掛開發的。

為了方便使用者編寫 Maven 外掛的方向和過程有個總體的瞭解,先介紹一下編寫Maven外掛的基本步驟。

建立 Maven 專案。外掛的功能肯定需要編寫Java類的,所以外掛本身就是一個Maven專案。當然,相對於以前研究的Maven專案,外掛專案有它的特殊點:packaging必須是maven-plugin型別,可以透過maven-archetype-plugin快速建立一個Maven外掛專案。

編寫外掛目標。每個外掛都至少包含一個目標,每個目標對應一個獨立的Java類。這裡把這種類叫Mojo類(物件)。Mojo類必須繼承AbstractMojo父類。

設定目標的配置點。大部分Maven外掛和它的目標都是可以配置的。根據需要,可以在編寫Mojo的時候給它設定好可以配置的引數。

編寫邏輯程式碼,實現目標功能。用Java程式碼實現外掛的功能。

處理錯誤和日誌。當Mojo執行的時候發生異常時,需要根據情況控制Maven的執行狀況,並且用程式碼實現必要的日誌輸出,為使用者提供必要的提示資訊。

測試外掛。編寫測試案例,繫結(或命令列)執行外掛。

不會開發Maven外掛(plugin)?我來幫你梳理內容

建立Maven專案

如下所示,我們選擇maven專案(其實只要是Maven專案都是可以的),最重要的是要把標籤對應的引數設定為maven-plugin快速建立一個Maven外掛專案。

不會開發Maven外掛(plugin)?我來幫你梳理內容

不會開發Maven外掛(plugin)?我來幫你梳理內容

編寫外掛目標

如下所示,我們繼承了AbstractMojo抽象類並且使用@Mojo註解聲明瞭外掛目標為demo-print,這個引數是必填的,不然你執行外掛的時候不就沒有執行目標名稱了麼。

@Mojo(name = “demo-print”)public class ListModuleMojo extends AbstractMojo { /** * 讀取專案及其子專案的版本號 */ @Override public void execute() throws MojoExecutionException, MojoFailureException { }}

這裡重點說一下我們經常會用到的幾個註解:

@Mojo:標記該類為Mojo類,常見引數說明:

name:宣告該Mojo的目標名稱

defaultPhase:宣告預設將該目標繫結到Maven生命週期的某個階段,預設是LifecyclePhase。NONE

requiresDependencyResolution:宣告執行該Mojo之前必須解析哪些範圍的依賴,預設是ResolutionScope。NONE

requiresDependencyCollection:所需的依賴項集合範圍,預設是ResolutionScope。NONE

instantiationStrategy:Mojo例項化策略,預設是InstantiationStrategy。PER_LOOKUP

executionStrategy:執行策略,預設是once-per-session

requiresProject:宣告該目標是不是必須在一個Maven專案中執行,預設值是true

aggregator:在多模組的Maven專案中,宣告該目標是否只在頂層模組構建的時候執行,預設false(也就是預設會執行父子模組)

requiresDirectInvocation:是否只能透過命令列的呼叫,預設為false

threadSafe:是否執行緒安全,預設是false(只是說明而已,執行緒安全還是需要自己保證)

@Parameter:將Mojo中的某個引數標記為可配置引數,常見引數說明:

name:引數名字

alias:別名設定

property:用於檢索值的屬性,可以透過-D或者pom檔案中配置

defaultValue:預設值

required:是否必須

readonly:是否只讀,預設為false,如果設定為true,那不能透過外界使用者對該屬性進行配置

@Component:元件注入

編寫程式碼邏輯

下面展示一個Demo。這個Demo很簡單,就是列印專案的根路徑。這裡我們可以看到Maven外掛的日誌列印方式是透過getLog()方式進行日誌列印。同時MojoExecutionException(打斷這個Maven執行流程的嚴重錯誤)和MojoFailureException(這個錯誤可能不至於嚴重到破壞整個執行流程)分別是兩個異常處理類,具體的區別參考:https://books。sonatype。com/mvnref-book/reference/writing-plugins-sect-custom-plugin。html

@Mojo(name = “demo-print”)public class ListModuleMojo extends AbstractMojo { @Parameter(defaultValue = “${project}”, required = true, readonly = true ) protected MavenProject project; /** * 讀取專案及其子專案的版本號 */ @Override public void execute() throws MojoExecutionException, MojoFailureException { if(Objects。isNull(project)) { throw new MojoExecutionException(“project物件不能為空”); } getLog()。info(“本地專案根路徑: ” + project。getBasedir()); }}

我們如何除錯Maven外掛呢?

首先外掛專案我們需要進行Debug配置,配置方式如下所示。

不會開發Maven外掛(plugin)?我來幫你梳理內容

然後在專案中引用對應的外掛,然後透過mvnDebug命令對外掛進行除錯即可。

常用的maven外掛

在日常開發中我們可能會用到的幾個外掛:

版本修改外掛(versions-maven-plugin)、snapshot&release流程控制外掛(maven-release-plugin)、規則校驗外掛(maven-enforcer-plugin)、依賴列印處理外掛(maven-dependency-plugin)、腳手架生成外掛(maven-archetype-plugin)、各種打包/編譯外掛(maven-compiler-plugin、maven-resources-plugin、spring-boot-maven-plugin、maven-assembly-plugin、maven-war-plugin、maven-jar-plugin)、maven-help-plugin等。