如何開發一個maven插件

maven是當下最流行的項目管理工具,其豐富的插件爲我們的工作帶來了很大的便利。

但是在一些情況下,開源的插件並不能完全滿足我們的需求,我們需要自己創建插件,本文就從0開始帶大家一起創建自己的插件。

【命名規範】

  首先,官方的命名規範是maven-xxx-plugin,爲了避免於官方衝突,我們可以將自己的插件命名爲xxx-maven-plugin

【創建插件項目】

本項目使用idea創建

我們首先需要創建一個Mojo(Maven plain Old Java Object)工程,如下圖:

 

 然後填寫我們的項目名以及groupId:

 

然後我們可以設置自己的maven目錄和settings的目錄:

 

然後咱們可以看到項目下有一個默認創建的類MyMojo:

該類繼承 AbstractMojo 這個抽象類,並實現了 execute() 方法,該方法就是用來定義這個 Mojo 具體操作內容,我們只需要根據自己的需要來編寫自己的實現即可。

 

類裏面默認實現了一個方法,可以創建一個文件,咱們爲了理解起來更簡單一點,修改得更簡單一些:

 

 我們依次解釋一下圖中紅框框住的四個部分:

    1. @goal------自定義 Maven 插件 Mojo 代碼中唯一必須聲明的標記,用來聲明該 Mojo 的目標名稱。
    2. @phase------默認將該目標綁定到 default 生命週期的某個階段。

圖中的生命週期爲程序運行期間。

    1. 每個Mojo類都需要繼承AbstractMojo ,並實現其execute()方法
    2. getLog()是Mojo類默認的日誌操作方法,直接調用可以使其在控制檯輸出相應內容。

【使用插件】

在test-maven-plugin中執行:

mvn clean install

 

執行成功之後,可以去本地庫裏面查看到生成的包:

 

然後我們打開另外一個項目,並在pom文件中添加:

<build>

    <plugins>

        <plugin>

            <groupId>com.github.liufarui</groupId>

            <artifactId>demo-maven-plugin</artifactId>

            <version>0.0.1-SNAPSHOT</version>

        </plugin>

    </plugins>

</build>

然後執行:

mvn clean package

這時我們可以在右側maven管理中看到我們的插件:

 

雙擊即可運行,可以在控制檯看到我們的運行結果:

其實就是簡單地打印了一句話。

我們也可以在項目下執行(由於我們的項目名符合XXX-maven-plugin規範,所以可以省略maven-plugin):

mvn demo:hello

也可以得到同樣的效果。

 

完整的命令格式爲:

mvn groupId:artifactId:version:goal

即:

 

【Mojo配置方式】

Mojo的配置有兩種方式:

一種是JavaDoc + Tag,即上面的示例代碼所使用的方式。

另一種是註解,使用@Mojo, @Parameter等annotation來配置。

下面簡單解釋一下各個標記的含義:

@goal<name>

自定義 Maven 插件 Mojo 代碼中唯一必須聲明的標記,用來聲明該 Mojo 的目標名稱。

@phase<name>

默認將該目標綁定到 default 生命週期的某個階段。
這樣在配置使用該插件目標時就可以不聲明 phase。

@requiresDependecyResolution<scope>

聲明運行該 Mojo 之前必須解析哪些範圍的依賴。

@requiresProject<true/false>

聲明該目標是不是必須在一個 Maven 項目中運行,默認值是true。

@requiresDirectInvoction<true/false>

聲明該目標是否只能使用命令行調用,默認值是 false,既可以在命令行中調用,也可以在 pom 中配置綁定生命週期階段。

@requiresOnline<true/false>

聲明 Maven 是不是必須是在線狀態,默認值是 false。

@requiresReport<true/false>

聲明是否要求項目報告已經生成,默認值是 false。

@aggregator

在多模塊的 Maven 項目中,聲明該目標是否只在頂層模塊構建的時候執行。

@execute goal="<goal>"

聲明執行該目標之前,先執行指定的目標。

如果該目標是自己插件的另外一個目標,直接 goal="目標名"。

如果該目標是另外一個插件的目標,就需要寫成 goal="目標前綴:目標名"。

@execute phase="<phase>"

聲明在執行該目標之前,Maven 先運行到當前生命週期的指定階段。

@execute lifecycle="<lifecycle>"phase="<phase>"

聲明在執行該目標之前,Maven 運行到指定生命週期的指定階段。


【使用註解開發Mojo】

首先添加依賴:

<dependency>

    <groupId>org.apache.maven.plugin-tools</groupId>

    <artifactId>maven-plugin-annotations</artifactId>

    <version>3.6.0</version>

</dependency>

需要指定maven-plugin-plugin的版本,否則有可能因爲默認的maven-plugin-plugin版本過低,導致不能識別註解:

<build>

    <plugins>

        <!-- 指定maven-plugin-plugin版本,默認版本過低,可能無法識別註解 -->

        <plugin>

            <groupId>org.apache.maven.plugins</groupId>

            <artifactId>maven-plugin-plugin</artifactId>

            <version>3.6.0</version>

        </plugin>

    </plugins>

</build>

 

然後創建新的類,繼承AbstractMojo,使用註解,如下:

 

然後執行mvn clean install,並在hello-world項目中運行插件:

 

【問題】

在項目文件夾之外運行插件的時候,可能會遇到以下問題:

Goal requires a project to execute but there is no POM in this directory (D:\test\code-demo). Please verify you invoked Maven from the correct directory. -> [Help 1]

此時,需要指定以下參數使插件可以脫離項目單獨執行:

requiresProject = false

結果:

 

【demo地址】

以上,即是整個maven-plugin入門開發內容,爲了方便大家查看學習,我把demo項目放到了我的github上,大家可以自行查看:

 

https://github.com/liufarui/code-demo

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章