maven插件简介
一般的maven插件使用时需要引入插件的gav(groupId,artifactId,version)就可以正常使用了。一般的结构如下:
包含插件的gav,还有一组可执行器<execution>。在每个<execution>里面包含有如下结构
一个可执行器的结构如上,其中各标签释义如下:
<configuration>表示该可执行器的配置项,后续在自定义实现maven插件中会详细的描述
<id>就是取个名字,别重复就行了
<phase>表示该可执行器在maven的生命周期的哪个阶段生效,如果不配置,使用插件默认的,maven的生命周期如下:
<goals>一组目标,每个<goal>表示一个对应的插件实现类(每个插件实现类都会关联自己的goal)。
当完成如上配置时,mavne在执行到相应的生命周期时,就会调用对应的goal实现类的相关方法完成业务逻辑处理
自定义实现
新建一个maven工程如下:
1 修改package
如上图,修改该maven工程的<packaging>标签为:
<packaging>maven-plugin</packaging>
2 引入依赖
需要引入maven插件的相关依赖:
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-plugin-api</artifactId>
<version>3.5.2</version>
</dependency>
3 编写代码
创建类继承org.apache.maven.plugin.AbstractMojo实现相关业务逻辑
public class PrintLogMojo extends AbstractMojo {
@Override
public void execute() throws MojoExecutionException, MojoFailureException {
Log log = getLog();
log.info("测试执行自定义插件goal是comment!");
}
}
在上面讲解maven的结构时有提到关于goal的绑定。goal绑定有2中方式:注释和注解
注释方式:
使用注释的方式绑定goal有的时候会存在问题:比如在类上再添加其他的xxxx的注释时,有可能会把类的注释也绑定上去了,该种方式不推荐
注解方式:
使用注解的方式绑定goal还需要引入一个依赖:
<dependency>
<groupId>org.apache.maven.plugin-tools</groupId>
<artifactId>maven-plugin-annotations</artifactId>
<version>3.5.2</version>
</dependency>
推荐使用该种方式绑定goal
在maven插件逻辑编写时也可以绑定该<execution>执行器的执行参数,如下所示:
import org.apache.commons.io.FileUtils;
import org.apache.maven.model.Build;
import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.MojoFailureException;
import org.apache.maven.plugins.annotations.LifecyclePhase;
import org.apache.maven.plugins.annotations.Mojo;
import org.apache.maven.plugins.annotations.Parameter;
import org.apache.maven.project.MavenProject;
import java.io.File;
import java.io.IOException;
/**
* 移动jar包到指定目录
*/
@Mojo(name = "move",defaultPhase = LifecyclePhase.PACKAGE)
public class MoveMojo extends AbstractMojo {
@Parameter(defaultValue = "${project}")
private MavenProject mavenProject;
@Parameter(required = true)
private String toAbsolutePath;
@Parameter(required = false)
private int age;
@Override
public void execute() throws MojoExecutionException, MojoFailureException {
String packaging = mavenProject.getPackaging();
Build build = mavenProject.getBuild();
String finalName = build.getFinalName();
// 最终打包的绝对路径也就是target文件夹目录
String directory = build.getDirectory();
String targetAbsolutePath = directory + File.separator + finalName + "." + packaging;
try {
FileUtils.copyFileToDirectory(new File(targetAbsolutePath),new File(toAbsolutePath));
} catch (IOException e) {
throw new RuntimeException("拷贝文件异常" + e.getMessage());
}
}
}
其中对象MavenProject表示整个maven工程对象的封装,可以从中拿到整个maven工程相关的配置项。其余的配置项是自定义的配置项,在每个<execution>标签均会绑定自己的<configuration>配置项。其中@Parameter注解的required属性表示该配置是否是必须的,如果是true,在使用该插件的该goal时就必须配置,具体使用如下:
4 打包安装
使用maven的install命令安装该插件到本地(或者公司私服或者公服)上,就可以被其他人使用了
5 引用实践
安装上述步骤将maven插件打包安装之后,就可以在其他的项目中使用该插件完成相关功能,配置demo如下:
当执行maven项目的package时,就可以在控制台看到自定义插件的日志打印和其他的功能