
最近接到了一個(gè)開(kāi)發(fā)maven插件的需求,就學(xué)習(xí)了一下,做一下總結(jié),也分享給大家,讓大家少百度一點(diǎn)資料,多學(xué)習(xí)一點(diǎn)知識(shí)。
-
選中maven插件模板
- 為你的maven插件起個(gè)名字
這里建議起名規(guī)則為 你的插件
功能+maven-plugin

- pom依賴(lài)升級(jí)
這里可以注意一下,maven插件的打包方式不是我們常見(jiàn)的
jar,pom,war而是maven-plugin,這里看一眼就行了......
刪掉原來(lái)的依賴(lài),原來(lái)的依賴(lài)版本太低了,并且整個(gè)項(xiàng)目是以java6為基礎(chǔ)的,不支持java8的一些新特性,我們需要替換一下配置。
<dependencies>
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-plugin-api</artifactId>
<version>3.5.2</version>
</dependency>
<dependency>
<groupId>org.apache.maven.plugin-tools</groupId>
<artifactId>maven-plugin-annotations</artifactId>
<version>3.5.2</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-plugin-plugin</artifactId>
<version>3.5.2</version>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>8</source>
<target>8</target>
</configuration>
</plugin>
</plugins>
</build>
- 編輯啟動(dòng)類(lèi)
maven提供了一個(gè)抽象類(lèi)供我們繼承,然后我們將插件的功能編寫(xiě)到方法體中就可以了。idea替我們生成的部分代碼如下:
注釋中的@goal表示插件指令的名稱(chēng),就像clean,install那些指令一樣。
為什么會(huì)在注釋中寫(xiě)這個(gè)指令,而不是注解中?
這是因?yàn)閙aven早于jdk 1.5 出現(xiàn)的,注解是jdk 1.5之后才出現(xiàn)的,所以,maven沒(méi)有辦法只能在注釋中寫(xiě),并通過(guò)掃描源碼實(shí)現(xiàn)類(lèi)似注解一樣的功能。剛剛我們已經(jīng)將依賴(lài)的版本升級(jí)成3.5.2了,這個(gè)版本是支持使用注解的,所以我們可以刪掉原來(lái)的注釋?zhuān)米⒔馊〈?/p>
調(diào)整后,我們的代碼是這樣的
@Mojo(name = "hello-world")
public class HelloWorldMojo extends AbstractMojo {
@Override
public void execute() throws MojoExecutionException {
// todo 自定義功能
}
}
我們將我們的插件功能編寫(xiě)到execute方法中就可以了
- 日志打印
maven將日志對(duì)象封裝在了我們繼承的那個(gè)抽象類(lèi)中,我們通過(guò)getLog()即可或者這個(gè)對(duì)象。

但是我們?cè)趯?shí)際開(kāi)發(fā)中,從工程學(xué)的角度講,不會(huì)將所有的邏輯都放在一個(gè)方法里面,需要對(duì)功能進(jìn)行細(xì)分,每個(gè)類(lèi)負(fù)責(zé)一些功能,所以我們想在任何類(lèi)都可以打日志,所以,我這里寫(xiě)了一個(gè)全局的日志類(lèi),然后通過(guò)靜態(tài)方法獲取日志打印對(duì)象。
public abstract class Logger {
private static Log log;
public static void setLog(Log log){
Logger.log = log;
}
public static void info(String msg){
log.info(msg);
}
public static void debug(String msg){
log.debug(msg);
}
public static void warn(String msg){
log.warn(msg);
}
public static void error(String msg){
log.error(msg);
}
}
在execute方法的第一行對(duì)日志對(duì)象進(jìn)行賦值,這樣我們就可以在任何地方通過(guò)調(diào)用自定義的Logger方法獲取日志對(duì)象,打印日志了。
public void execute() throws MojoExecutionException {
Logger.setLog(getLog());
}
- 配置信息
3.1 在maven啟動(dòng)類(lèi)的屬性中標(biāo)注@Parameter注解,我們的屬性可以是String,可以是對(duì)象,也可以是List。
@Mojo(name = "hello-world")
public class HelloWorldMojo extends AbstractMojo {
@Parameter(readonly = true)
private String helloStr;
@Parameter(required = true)
private List<String> scanPackages;
@Override
public void execute() throws MojoExecutionException {
Logger.setLog(getLog());
Logger.info(helloStr);
}
}
3.2 使用maven的變量
通過(guò)在@Paramter中的defaultValue使用${maven變量名稱(chēng)}使用maven變量。
@Mojo(name = "hello-world")
public class GlossaryCheckerMojo extends AbstractMojo {
@Parameter(defaultValue = "${project.basedir}", readonly = true)
private File basedir;
}
對(duì)應(yīng)的maven配置
<plugin>
<groupId>org.ywb</groupId>
<artifactId>hello-world-maven-plugin</artifactId>
<version>1.0.0</version>
<configuration>
<helloStr>hello-plugin</helloStr>
<scanPackages>
<scanPackage>org.ywb.hello</scanPackage>
<scanPackage>org.ywb.hello1</scanPackage>
</scanPackages>
</configuration>
</plugin>
3.3 maven插件發(fā)布
-
源碼安裝
直接通過(guò)idea的install指令即可安裝到本地
- 通過(guò)maven 指令安裝
先通過(guò)package將插件打包,然后手動(dòng)執(zhí)行maven-install指令
mvn install:install-file
-Dfile="xxxxx/hello-world-maven-plugin-1.0.0.jar"
-DgroupId="org.ywb"
-DartifactId="hello-world-maven-plugin"
-Dversion="1.0.0"
-Dpackaging=jar
附錄
maven 插件開(kāi)發(fā)常用的工具
- java SPI
java的SPI機(jī)制類(lèi)似于Spring框架,可以對(duì)對(duì)象進(jìn)行管理,可以看下面這個(gè)博客學(xué)習(xí)使用
https://www.cnblogs.com/jy107600/p/11464985.html - 源碼解析工具,qdox
如果我們開(kāi)發(fā)插件的時(shí)候,需要獲取類(lèi)的一些信息,qdox真的非常好用!大家可以看這個(gè)鏈接
https://zhuanlan.zhihu.com/p/115606527



