如何開發一個maven插件
- 2020 年 11 月 18 日
- 筆記
- JAVA, linux, maven, maven-plugin
maven是當下最流行的項目管理工具,其豐富的插件為我們的工作帶來了很大的便利。
但是在一些情況下,開源的插件並不能完全滿足我們的需求,我們需要自己創建插件,本文就從0開始帶大家一起創建自己的插件。
【命名規範】
首先,官方的命名規範是maven-xxx-plugin,為了避免於官方衝突,我們可以將自己的插件命名為xxx-maven-plugin。
【創建插件項目】
本項目使用idea創建。
我們首先需要創建一個Mojo(Maven plain Old Java Object)工程,如下圖:
然後填寫我們的項目名以及groupId:
然後我們可以設置自己的maven目錄和settings的目錄:
然後咱們可以看到項目下有一個默認創建的類MyMojo:
該類繼承 AbstractMojo 這個抽象類,並實現了 execute() 方法,該方法就是用來定義這個 Mojo 具體操作內容,我們只需要根據自己的需要來編寫自己的實現即可。
類裡面默認實現了一個方法,可以創建一個文件,咱們為了理解起來更簡單一點,修改得更簡單一些:
我們依次解釋一下圖中紅框框住的四個部分:
-
- @goal——自定義 Maven 插件 Mojo 程式碼中唯一必須聲明的標記,用來聲明該 Mojo 的目標名稱。
- @phase——默認將該目標綁定到 default 生命周期的某個階段。
圖中的生命周期為程式運行期間。
-
- 每個Mojo類都需要繼承AbstractMojo ,並實現其execute()方法。
- 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 生命周期的某個階段。 |
@requiresDependecyResolution<scope> |
聲明運行該 |
@requiresProject<true/false> |
聲明該目標是不是必須在一個 Maven 項目中運行,默認值是true。 |
@requiresDirectInvoction<true/false> |
聲明該目標是否只能使用命令行調用,默認值是 false,既可以在命令行中調用,也可以在 pom 中配置綁定生命周期階段。 |
@requiresOnline<true/false> |
聲明 |
@requiresReport<true/false> |
聲明是否要求項目報告已經生成,默認值是 false。 |
@aggregator |
在多模組的 |
@execute goal="<goal>" |
聲明執行該目標之前,先執行指定的目標。 如果該目標是自己插件的另外一個目標,直接 goal="目標名"。 如果該目標是另外一個插件的目標,就需要寫成 goal="目標前綴:目標名"。 |
@execute phase="<phase>" |
聲明在執行該目標之前,Maven 先運行到當前生命周期的指定階段。 |
@execute lifecycle="<lifecycle>"phase="<phase>" |
聲明在執行該目標之前,Maven 運行到指定生命周期的指定階段。 |
【使用註解開發Mojo】
首先添加依賴:
<dependency> </dependency> |
需要指定maven-plugin-plugin的版本,否則有可能因為默認的maven-plugin-plugin版本過低,導致不能識別註解:
<build> </build> |
然後創建新的類,繼承AbstractMojo,使用註解,如下:
然後執行mvn clean install,並在hello-world項目中運行插件:
【問題】
在項目文件夾之外運行插件的時候,可能會遇到以下問題:
Goal requires a project to |
此時,需要指定以下參數使插件可以脫離項目單獨執行:
requiresProject = false |
結果:
【demo地址】
以上,即是整個maven-plugin入門開發內容,為了方便大家查看學習,我把demo項目放到了我的github上,大家可以自行查看:
//github.com/liufarui/code-demo