maven-自定义插件
maven中的插件是有很多目标(goal)组成的,开发插件,实际上就是去编写插件中目标的具体代码。
每个目标对应一个java类,这个类在maven中叫做mojo,maven提供了一个mojo的接口,我们开发插件也就是去实现这个接口的方法
org.apache.maven.plugin.Mojo接口有3个方法
- execute:这个方法比较重要,目标的主要代码就在这个方法中实现,当使用mvn命令调用插件的目标的时候,最后具体调用的就是这个方法
- setLog:注入一个标准的maven日志记录器,允许这个mojo向用户传递事件和反馈
- getLog:获取注入的日志记录器
Log:日志记录器,这是一个日志接口,里面定义了很多方法,主要作用输出日志,比如运行mvn clean,会输出很多提示信息,这些输出信息就是通过Log来输出的
Mojo接口有个默认的抽象类:
org.apache.maven.plugin.AbstractMojo
这个类把Mojo接口中的setLog和getLog实现了,而execute方法没有实现,交给继承者去实现
具体步骤
-
创建一个maven构建,这个构建的packaging比较特殊,必须为maven-plugin,标识构建是一个插件类型
<packaging>maven-plugin</packaging>
-
导入maven插件依赖(二选一)
<!-- doc方式 --> <dependency> <groupId>org.apache.maven</groupId> <artifactId>maven-plugin-api</artifactId> <version>3.0</version> </dependency> <!-- 注解方式 --> <dependency> <groupId>org.apache.maven.plugin-tools</groupId> <artifactId>maven-plugin-annotations</artifactId> <version>3.4</version> <scope>provided</scope> </dependency>
-
创建一个目标类,需要继承AbstractMojo或实现Mojo
-
目标类中添加注解
@org.apache.maven.plugins.annotations.Mojo(name="目标名称")
或者在类上添加注释
/** * @goal 目标名称 */
-
在目标类的execute方法中实现具体的逻辑,并且可以通过getLog().info()方法输出日志
-
安装插件到本地仓库
mvn clean install
-
注册插件在settings.xml中添加配置
<pluginGroups> <pluginGroup>插件的groupId</pluginGroup> </pluginGroups>
-
使用插件,执行命令
mvn 插件前缀:目标名称
,或者配置到buidl标签里<build> <plugins> <plugin> <!--插件坐标--> <groupId>com.dqn.maven</groupId> <artifactId>my-maven-plugin</artifactId> <version>1.0-SNAPSHOT</version> <executions> <execution> <id>my-plugin</id> <!--绑定生命周期--> <phase>clean</phase> <!--执行目标--> <goals> <goal>dqn</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
maven会根据插件的artifactId来识别插件前缀
- 前置匹配:${前缀}-maven-plugin,如果artifactId是hello-maven-plugin,则前缀是hello
- 中间匹配:maven-${前缀}-plugin,如果artifactId是maven-hello-plugin,则前缀是hello
参数
@Parameter注解将变量标识为mojo参数
- defaultValue:定义变量的默认值
- property:为
-D
参数名=参数值设置参数名
使用这通过:
-
pom文件:
<configuration> <参数名>参数值</参数名> </configuration>
-
mvn命令:
mvn ... -D参数名=参数值