Maven插件開發

Maven插件開發
Maven 插件開發—-讓maven使用更加靈活
對於習慣於使用maven構建、管理項目的人來講,maven就是項目開發、測試、部署的一把利器:對類庫的集中管理;依賴傳遞、繼承、重用性高;對整個項目開發生命週期的完整支持,從頭至尾只須要幾個簡單的命令就能夠快速地遍歷整個開發週期,減輕了配置管理的工做量。這些優秀的功能都是經過maven插件庫裏提供的豐富插件來完成的。所以,掌握maven插件開發、在實際工做中根據本身的須要開發適合本身需求maven插件,是頗有必要的。
這篇文章先從動手實踐開始,迅速開發出本身的一個maven插件,而後根據主要構建過程和配置予以簡單說明。

一,快速開發你的第一個插件

1,建立一個maven-plugin目錄,並經過CMD程序從後臺進入此目錄。
2,運行命令:
mvn archetype:create -DgroupId=com.taobao.maven -DartifactId=maven-hello-plugin -DarchetypeArtifactId=maven-archetype-mojo
3,進入maven-hello-plugin目錄,運行命令:mvn eclipse:eclipse構建eclipse工程。
4,經過eclipse import工程,刪除包下面自動生成的java文件,新建GreetingMojo.java和GoodByeMojo.java,分別對應打招呼、再見兩個動做。
GreetingMojo.java的內容以下:
package com.taobao.maven;
import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugin.MojoExecutionException;
/**
* @goal greeting
*/
public class GreetingMojo extends AbstractMojo {
/**
* @parameter expression=」${greeting.words}」 default-value=」Hello to you!」
*/
private String words ;
public void execute() throws MojoExecutionException {
getLog().info(words);
}
}
 
GoodByeMojo.java的內容以下:
package com.taobao.maven;
import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.MojoFailureException;
/**
* @goal goodBye
*/
public class GoodByeMojo extends AbstractMojo {
/**
* @parameter expression=」${goodBye.words}」 default-value=」goodBye to you!」
*/
private String words;
public void execute() throws MojoExecutionException, MojoFailureException {
getLog().info(words);
}
}
 
pom.xml中的依賴爲:
< dependency >
       < groupId >org.apache.maven </ groupId >
       < artifactId >maven-plugin-api </ artifactId >
       < version >2.0 </ version >
     </ dependency >
     < dependency >
       < groupId >com.alibaba.external </ groupId >
       < artifactId >test.junit </ artifactId >
       < version >4.4 </ version >
       < scope >test </ scope >
     </ dependency >

5,    文件編寫完成後回到cmd命令行,在項目的pom文件目錄處運行install命令將插件安裝到本地repository:mvn clean install
6,    安裝成功後繼續運行以下命令查看插件的運行狀況:
運行:
mvn com.taobao.maven:maven-hello-plugin:1.0-SNAPSHOT:greeting
,能夠看到控制檯看到輸出:「Hello to you!」;這個輸出是插件的默認參數:
default-value=」Hello to you!」
運行
mvn com.taobao.maven:maven-hello-plugin:1.0-SNAPSHOT:goodBye
,能夠在控制檯看到輸出:「goodBye to you!」;這個輸出是插件的默認參數:
default-value=」goodBye to you!」
運行:
mvn com.taobao.maven:maven-hello-plugin:1.0-SNAPSHOT:greeting -Dgreeting.words=」welcome!」
能夠在控制檯看到輸出:「welcome!」;這個在命令中明確指定插件的參數,所以輸出的是指定的參數「welcome!」。
運行
mvn com.taobao.maven:maven-hello-plugin:1.0-SNAPSHOT:goodBye -DgoodBye.words=」see you!」
能夠在控制檯看到輸出:「see you!」;這個在命令中明確指定插件的參數,所以輸出的是指定的參數「see you!」。
7,至此,一個「見面寒暄」的簡單maven插件基本完成。

二,插件開發過程的相關說明

1,MOJO
Maven 經過插件動做完成大多數構建任務。能夠把 Maven 引擎認爲是插件動做的協調器。插件中的每一個任務goal稱做一個 Mojo( Maven plain  Old  Java  Object)。項目中每個Mojo都要實現org.apache.maven.plugin.Mojo接口,上面的插件示例的Mojo經過擴展org.apache.maven.plugin.AbstractMojo類實現了該接口。Mojo提供過了以下的方法:
void setLog( org.apache.maven.monitor.logging.Log log )
每個Mojo實現都必須提供一種方法讓插件可以和某個特定目標的過程相交流。該目標成功了麼?或者,是否在運行目標的時候遇到了問題?當Maven加載並運行Mojo的時候,它會調用setLog()方法,爲Mojo實例提供正確的日誌目標,以讓你在自定義插件中使用。
protected Log getLog()
Maven會在Mojo運行以前調用setLog()方法,而後你的Mojo就能夠經過調用getLog()得到日誌對象。Mojo應該去調用這個Log對象的方法,而不是直接將輸出打印到標準輸出或者控制檯。
void execute() throws org.apache.maven.plugin.MojoExecutionException
輪到運行目標的時候,Maven就會調用該方法。
Mojo接口只關心兩件事情:目標運行結果的日誌記錄,以及運行一個目標。當編寫自定義插件的時候,須要擴展AbstractMojo。AbstractMojo處理setLog()和getLog()的實現,幷包含一個抽象的execute()方法。在擴展AbstractMojo的時候,你所須要作的只是實現execute()方法。
2,Phase
Maven 對構建生命週期的固定理解包含了許多不一樣的階段,以下表:
...省略
3,插件組成
每個mojo都由一些註解annotation來描述,這些註解是在java類的上面標註。經常使用的幾個註解以下:
execute:註解形式:
a), @execute phase=」<phaseName>」 lifecycle=」<lifecycleId>」;
b), @execute phase=」<phaseName>」
c), @execute goal=」<goalName>」
當這個目標goal被調用時,它會先調用一個平行的生命週期,在制定的階段結束。若是插件沒有被指定階段,這一目標將會單獨執行。
goal:註解形式:@goal <goalName>
用戶在命令行下直接調用插件的目標goal,或者在項目的pom文件中經過配置調用這個goal。
phase:註解形式:@phase <phaseName>
綁定這個mojo到標準構建生命週期裏對應的階段。
 
對於一個mojo裏的變量參數,也有一些經常使用的註解:
configuration:註解形式:
@parameter expression=」${aSystemProperty}」 default-value=」${anExpression}」
對參數指定一個計算表達式、在mojo構建時將計算結果注入到此變量中,同時也能夠給定一個默認值。這個參數值也能夠在pom文件中予以配置。

三,在其餘工程中使用此插件

伴隨插件開發完成,在被其餘項目使用時有比較多的、靈活的配置,接下來也經過一個示例來使用這個插件。
1,回到maven-plugin目錄,建立插件測試工程:
mvn archetype:create -DgroupId=com.taobao.maven -DartifactId=plugin-test -Dpackaging=jar
2,在測試工程的pom文件中加入插件依賴:
<build>
<plugins>
<plugin>
<groupId>com.taobao.maven</groupId>
<artifactId>maven-hello-plugin</artifactId>
<version>1.0-SNAPSHOT</version>
</plugin>
</plugins>
</build>
3,在上述配置後可使用這個插件了,可是這個插件在開發的時候並無定義插件運行的生命週期,並且,在使用時也但願獲得更加靈活的參數配置,所以在使用時大多采用以下的配置:
<plugin>
  <groupId>com.taobao.maven</groupId>
  <artifactId>maven-hello-plugin</artifactId>
  <version>1.0-SNAPSHOT</version>
  <executions>
    <execution>
     <id>compile phase</id>
     <phase>compile</phase>
     <goals>
      <goal>greeting</goal>
     </goals>
     <configuration>
      <words>hello everyone</words>
      </configuration>
    </execution>
    <execution>
      <id>test phase</id>
     <phase>test</phase>
     <goals>
      <goal>goodBye</goal>
     </goals>
    <configuration>
      <words>goodbye everyone</words>
     </configuration>
    </execution>
   </executions>
</plugin>
這個配置對這個插件定義了運行時的生命週期,在編譯compile階段運行插件的greeting 目標,輸出greeting.words是「hello everyone」;在測試test階段運行插件的goodBye 目標,輸出goodBye.words是「goodbye everyone」。配置完成後,回到命令行的plugin-test工程目錄下運行:mvn clean package,便可看到對應階段的輸出信息。
相關文章
相關標籤/搜索