當maven內置的功能不能滿足需求的時候怎麼辦?那隻能給它寫插件瞭。
網絡上很多maven的文章,但基本很少談及如何給它寫插件,即使你搜索maven plugin,也隻是給你返回一堆如何使用maven插件的文章。希望這邊文章能給一些maven使用者帶來幫助。我在這裡先假設你已經懂得使用maven,我不會貼出完整的pom.xml文件
首先,你需要創建一個maven項目,插件是一種特殊的maven項目
然後修改pom.xml,將packaging改為maven-plugin
1
<packaging>maven-plugin</packaging>
通過properties定義maven的版本
1
<properties>
2
<maven.version>2.2.1</maven.version>
3
</properties>
maven3已經出瞭很久,並且兼容maven2,但是我這裡編寫插件使用的是maven2,可以同時在maven2和maven3下使用,不過其實這個原因並不重要,真正的原因是因為maven3的代碼實在太爛瞭,最初的時候我用maven3的api lib來寫,發現裡面很多代碼根本沒有註釋,而且很多代碼已經廢棄,但是並沒有明確說明究竟用什麼方法代替。最後我使用瞭maven2中被maven3廢棄的api來完成我的功能,跑的挺好的,就是有時可能會有一些使用準備廢棄的api的提醒而已。
接著添加依賴
01
<dependencies>
02
<dependency>
03
<groupId>org.apache.maven</groupId>
04
<artifactId>maven-plugin-api</artifactId>
05
<version>${maven.version}</version>
06
</dependency>
07
<dependency>
08
<groupId>org.apache.maven</groupId>
09
<artifactId>maven-core</artifactId>
10
<version>${maven.version}</version>
11
</dependency>
12
</dependencies>
然後開始創建Mojo類,maven插件裡面每一個具體的功能都是一個Mojo
比如說eclipse:clean和eclipse:eclipse就是兩個Mojo
1
/**
2
* @goal helloWorld
3
*/
4
public class HelloWorldMojo extends AbstractMojo {
5
public void execute() throws MojoExecutionException
6
{
7
getLog().info("Hello, world!");
8
}
9
}
首先繼承AbstractMojo,並且實現execute()方法,這個就是每次調用進入的地方
然後需要在類的Javadoc上定義,這是一個annotation出來之前常用的定義方法(或許未來maven會將它改成annotation,那就能提供編譯校驗和IDE校驗)。我們必須定義@goal,代表運行目標,簡單來說就是eclipse:clean中的clean
Mojo寫在哪個package底下都是可以的
這樣,我們就完成瞭一個簡單的maven plugin,然後我們需要一個簡單的測試來確定他正確運行
先通過maven install將它安裝到本地倉庫
然後打開任意maven的項目(比如說我們原來已經在用maven的項目),在pom.xml增加一個plugin
01
<build>
02
<plugins>
03
<plugin>
04
<groupId>xxx</groupId>
05
<artifactId>xxx</artifactId>
06
<version>xxx</version>
07
<executions>
08
<execution>
09
<phase>compile</phase>
10
<goals>
11
<goal>helloWorld</goal>
12
</goals>
13
</execution>
14
</executions>
15
</plugin>
16
</plugins>
17
</build>
需要留意的是phase部分,我們將這個plugin綁定到compile這個周期
然後我們運行mvn compile,就能成功看見Hello, world!輸出
(當然你也可以直接通過命令行運行,需要帶上完整的groupId和artifactId才能調用)