如何編寫maven plugin (一) 基礎 – JAVA編程語言程序開發技術文章

當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才能調用)

發佈留言