Maven為我們提供了豐富的插件資源,使得開發調試過程中非常方便,可以滿足大多數場景下的需求。當然有時候,我們也需要根據需求定制自己的插件。下面是在開發Maven插件時的一點備忘錄,具體的開發流程請Google,有不少的教程,這里只是概述一下,同時記錄一些容易掉坑的點。
1,Maven的工具由一個又一個的插件組成的,插件類繼承了AbstractMojo類,需要覆寫execute方法。getLog()獲取的是AbstractMojo內部的log,類型是:org.apache.maven.plugin.logging.Log; 在Mojo的開發中,不要使用其他的Log基礎設施。注: Mojo = Maven Old Java Object;
public class Example extends AbstractMojo{ public void execute() throws MojoExecutionException, MojoFailureException { getLog().info("Hello world"); } }
2,pom.xml文件中,打包(packaging)類型應該為 maven-plugin,而不是war/jar。同時需要依賴的兩個核心依賴是:
3,開發Maven插件和開發普通的Maven工程的流程是一樣的,不同在於插件的 archetype應該設置為:maven-archetype-plugin;
- maven-plugin-api:這是插件開發的api;
- maven-plugin-annotations:這是進行插件注解的api。
4,插件的入口類為繼承了AbstractMojo的實現類,但是需要進行注解。注解@Mojo是必須要的,這是定義插件對象的啟動方法,由於該類只有一個方法,所以啟動方法和啟動類是一致的。在Maven 3之前是使用注釋注解:@goal doSomething這種方式。現在已經不使用這種方式了。舉個例子,如果進行如下標注:
@Mojo( name = "doSomething") public class GreetingMojo extends AbstractMojo{ ... }
那么運行的時候使用如下方式執行:
mvn groupId:artifactId:version:doSomething //如果一個項目中只有一個@Mojo標記,則verison可以省略
5,除了標注執行的方法,還可對成員變量進行標注,以便自動獲取或由用戶傳入參數。
@Parameter( property = "greeting", defaultValue = "Hello World!" ) //這是由用戶傳入的參數,可以在命令行中由-D參數傳入 private String greeting; @Parameter( expression = "${project}", defaultValue = "${project}" ) //還可以使用表達式,引用Maven工程中定義好的變量 private String project;
6,每個Mojo(由@Mojo標注)都有生命周期,即該Mojo的執行時間。用戶可以選擇將某個插件目標綁定到生命周期的某個階段,從而讓構建過程更為完善。生命周期的具體介紹參考文末給出的文章。下面將插件配置到編譯階段執行:
<build> <plugins> <plugin> <groupId>sample.plugin</groupId> <artifactId>doSomething-maven-plugin</artifactId> <version>1.0-SNAPSHOT</version> <executions> <execution> <phase>compile</phase> <goals> <goal>doSomething</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
總體來說Maven插件的開發思路還是比較清晰的。
參考資料: