Maven插件開發引導--第一個maven插件項目
前言
因爲最近覺得mybatis自動生成代碼的功能很有用且有趣,就打算研究一下maven插件。本文的主要目的是使用命令行和使用idea引導建立第一個簡單的”hello,world” maven插件,部分參考了官方的文檔。個人感覺官方文檔內容設計不是特別好,有興趣有能力的同學可以自己看。
重要官方提示:插件命名規範和Apache Maven商標
你最好命名你的插件爲<yourplugin>-maven-plugin。
強烈不建議你命名插件爲maven-<yourplugin>-plugin(maven放在開頭),因爲這個命名模式是爲Apache Maven團隊的groupId爲org.apache.maven.plugins的插件項目保留的。使用這個命名模式侵犯了Apache Maven的商標。
你的第一個插件
在這個部分,我們將會創建一個簡單的插件,這個插件不需要任何參數而且運行時只在屏幕上顯示一條信息。這樣,我們能夠展示創建一個插件項目的基本要點、最簡單的Java mojo的內容定義,以及幾種運行mojo的方法。
命令行創建
先展示整個項目的目錄結構。
你的第一個mojo
簡單來說,一個java mojo就是一個簡單的能夠實現一個插件的目標的java類。儘管一個插件中,幾個相似的mojo也可能會有一個父類來實現共同的代碼,但是不需要像EJBs一樣需要很多的類。
當遍歷源碼目錄獲取mojo類時,插件工具會尋找帶有Java 5 @Mojo 註解或者 "goal"javadoc註解的類。帶有這個註解的類都會被被包含在插件的配置文件中。
A Simple mojo
下面是一個簡單的沒有參數的mojo的例子。
package sample.plugin;
import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugins.annotations.Mojo;
/**
* Says "Hi" to the user.
*
*/
@Mojo( name = "sayhi")
public class GreetingMojo extends AbstractMojo
{
public void execute() throws MojoExecutionException
{
getLog().info( "Hello, world." );
}
}
- 除了excute方法,類org.apache.maven.plugin.AbstractMojo提供了實現一個mojo的所有基礎要素。
- 需要註解@Mojo
- excute方法可以拋出兩種異常:
- org.apache.maven.plugin.MojoExecutionException:如果出現任何未知的錯誤,拋出這個異常將會顯示一個“BUILD ERROR”信息。
- org.apache.maven.plugin.MojoFailureException:如果產生髮生了已知的問題,拋出這個異常將會顯示一個“BUILD FAILURE”信息。
- getLog方法(在AbstractMojo中定義)返回一個類似log4j的logger對象,這個對象允許插件創建“debug”、”info“、“warn”、”error”標籤的日誌。這個logger對象可以作爲一個給用戶打印日誌的一個方式。
pom配置:
mojo類完成了之後,爲了正確的完成構建,項目需要合理地設置一些配置。
groupId | 插件的groupId,最好匹配這個MOJO包的通用的前綴 |
---|---|
artifactId | 插件名 |
version | 插件版本 |
packaging | 應該設置爲“maven-plugin” |
dependencies | 對於Maven Plugin Tools API,需要引入的依賴,這樣項目才能去解析"AbstractMojo" 和相關的其他類。 |
下面是對上面表格中描述的參數在一個簡單的mojo項目的pom中如何設置的舉例說明:
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>sample.plugin</groupId>
<artifactId>hello-maven-plugin</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>maven-plugin</packaging>
<name>Sample Parameter-less Maven Plugin</name>
<dependencies>
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-plugin-api</artifactId>
<version>3.0</version>
</dependency>
<!-- dependencies to annotations -->
<dependency>
<groupId>org.apache.maven.plugin-tools</groupId>
<artifactId>maven-plugin-annotations</artifactId>
<version>3.4</version>
<scope>provided</scope>
</dependency>
</dependencies>
</project>
構建一個插件
定義在maven-plugin中,有幾個和標準構建流程相關的插件功能。
compile | 編譯插件的java代碼 |
---|---|
process-classes | 獲取數據構建關鍵字 |
test | 運行插件單元測試 |
package | 構建插件jar包 |
install | 在本地倉庫中部署插件jar包 |
deploy | 在遠程倉庫部署插件jar包 |
在項目根目錄下執行 mvn install,就能編譯部署插件jar包到本地倉庫。
也可以使用模板構建一個maven插件項目,直接執行命令:
mvn archetype:generate -DgroupId=sample.plugin -DartifactId=hello-maven-plugin -DarchetypeGroupId=org.apache.maven.archetypes -DarchetypeArtifactId=maven-archetype-plugin
一路回車確定,就會在當前目錄生成一個模板插件項目。
執行你的第一個Mojo
執行你的新插件最直接的方式是在命令行中。首先在你的項目中的pom.xml中添加下面的語句,引入這個插件。
···
<build>
<plugins>
<plugin>
<groupId>sample.plugin</groupId>
<artifactId>hello-maven-plugin</artifactId>
<version>1.0-SNAPSHOT</version>
</plugin>
</plugins>
</build>
···
然後需要在項目根目錄下以下面的完整格式:
mvn groupId:artifactId:version:goal
執行插件。例如上面的例子就是"mvn sample.plugin:hello-maven-plugin:1.0-SNAPSHOT:sayhi"。如果你是要測試這個插件是否成功,也可以直接在插件項目的根目錄執行"mvn sample.plugin:hello-maven-plugin:1.0-SNAPSHOT:sayhi",運行結果如下:
還可以將插件和具體的構建生命週期綁定起來,需要在pom中修改build配置。
···
<build>
<plugins>
<plugin>
<groupId>sample.plugin</groupId>
<artifactId>hello-maven-plugin</artifactId>
<version>1.0-SNAPSHOT</version>
<executions>
<execution>
<phase>compile</phase>
<goals>
<goal>sayhi</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
···
這樣配置的話,當項目在編譯的過程中你的插件也會被執行。具體信息可以參考後續的文章(如果有,我會在這裏補充出來O. O)。
idea創建
生成插件項目
idea創建一個插件模板項目就比較簡單了,以下是貼圖流程。
- 首先創建一個maven mojo的插件項目
- 設置項目
- 一路點擊下一步,然後生成plugin項目
自動生成的代碼已經包括了Mojo類,可以修改excute方法的內容,輸出“hello world"。
引用插件
在pom.xml中引入插件配置後,可以在idea的maven構建窗口看到:
雙擊運行可以看到日誌輸出: