前言
Maven是现在最流行的项目管理工具,同时Maven的插件也给我们提供了非常多的便利,本次我就给大家将一下Maven是如何进行自定义插件开发的。
为了方便用户编写 Maven 插件的方向和过程有个总体的了解,先介绍一下编写Maven插件的基本步骤。
- 创建 Maven 项目。插件的功能肯定需要编写Java类的,所以插件本身就是一个Maven项目。当然,相对于以前研究的Maven项目,插件项目有它的特殊点:packaging必须是maven-plugin类型,可以通过maven-archetype-plugin快速创建一个Maven插件项目。
- 编写插件目标。每个插件都至少包含一个目标,每个目标对应一个独立的Java类。这里把这种类叫Mojo类(对象)。Mojo类必须继承AbstractMojo父类。
- 设置目标的配置点。大部分Maven插件和它的目标都是可以配置的。根据需要,可以在编写Mojo的时候给它设置好可以配置的参数。
- 编写逻辑代码,实现目标功能。用Java代码实现插件的功能。
- 处理错误和日志。当Mojo运行的时候发生异常时,需要根据情况控制Maven的运行状况,并且用代码实现必要的日志输出,为用户提供必要的提示信息。
- 测试插件。编写测试案例,绑定(或命令行)执行插件。
创建Maven项目
如下所示,我们选择maven项目(其实只要是Maven项目都是可以的),最重要的是要把<packaging>标签对应的参数设置为maven-plugin快速创建一个Maven插件项目。
编写插件目标
如下所示,我们继承了AbstractMojo抽象类并且使用@Mojo注解声明了插件目标为demo-print,这个参数是必填的,不然你执行插件的时候不就没有执行目标名称了么。
@Mojo(name = "demo-print")
public class ListModuleMojo extends AbstractMojo {
/**
* 读取项目及其子项目的版本号
*/
@Override
public void execute() throws MojoExecutionException, MojoFailureException {
}
}
这里重点说一下我们经常会用到的几个注解:
- @Mojo:标记该类为Mojo类,常见参数说明:
name:声明该Mojo的目标名称
defaultPhase:声明默认将该目标绑定到Maven生命周期的某个阶段,默认是LifecyclePhase.NONE
requiresDependencyResolution:声明运行该Mojo之前必须解析哪些范围的依赖,默认是ResolutionScope.NONE
requiresDependencyCollection:所需的依赖项集合范围,默认是ResolutionScope.NONE
instantiationStrategy:Mojo实例化策略,默认是InstantiationStrategy.PER_LOOKUP
executionStrategy:执行策略,默认是once-per-session
requiresProject:声明该目标是不是必须在一个Maven项目中运行,默认值是true
aggregator:在多模块的Maven项目中,声明该目标是否只在顶层模块构建的时候执行,默认false(也就是默认会执行父子模块)
requiresDirectInvocation:是否只能通过命令行的调用,默认为false
threadSafe:是否线程安全,默认是false(只是说明而已,线程安全还是需要自己保证)
- @Parameter:将Mojo中的某个参数标记为可配置参数,常见参数说明:
name:参数名字
alias:别名设置
property:用于检索值的属性,可以通过-D或者pom文件中配置
defaultValue:默认值
required:是否必须
readonly:是否只读,默认为false,如果设置为true,那不能通过外界用户对该属性进行配置
- @Component:组件注入
编写代码逻辑
下面展示一个Demo。这个Demo很简单,就是打印项目的根路径。这里我们可以看到Maven插件的日志打印方式是通过getLog()方式进行日志打印。同时MojoExecutionException(打断这个Maven执行流程的严重错误)和MojoFailureException(这个错误可能不至于严重到破坏整个执行流程)分别是两个异常处理类,具体的区别参考:https://books.sonatype.com/mvnref-book/reference/writing-plugins-sect-custom-plugin.html
@Mojo(name = "demo-print")
public class ListModuleMojo extends AbstractMojo {
@Parameter(defaultValue = "${project}", required = true, readonly = true )
protected MavenProject project;
/**
* 读取项目及其子项目的版本号
*/
@Override
public void execute() throws MojoExecutionException, MojoFailureException {
if(Objects.isNull(project)) {
throw new MojoExecutionException("project对象不能为空");
}
getLog().info("本地项目根路径: " + project.getBasedir());
}
}
我们如何调试Maven插件呢?
首先插件项目我们需要进行Debug配置,配置方式如下所示。
然后在项目中引用对应的插件,然后通过mvnDebug命令对插件进行调试即可。
常用的maven插件
在日常开发中我们可能会用到的几个插件:
版本修改插件(versions-maven-plugin)、snapshot&release流程控制插件(maven-release-plugin)、规则校验插件(maven-enforcer-plugin)、依赖打印处理插件(maven-dependency-plugin)、脚手架生成插件(maven-archetype-plugin)、各种打包/编译插件(maven-compiler-plugin、maven-resources-plugin、spring-boot-maven-plugin、maven-assembly-plugin、maven-war-plugin、maven-jar-plugin)、maven-help-plugin等。