一、开发自定义插件
新建Maven工程,修改pom.xml如下:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>hello-maven-plugin</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>maven-plugin</packaging>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.encoding>UTF-8</maven.compiler.encoding>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<maven-plugin-tools.version>3.6.4</maven-plugin-tools.version>
</properties>
<dependencies>
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-plugin-api</artifactId>
<version>3.6.3</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.maven.plugin-tools</groupId>
<artifactId>maven-plugin-annotations</artifactId>
<version>${maven-plugin-tools.version}</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-plugin-plugin</artifactId>
<version>${maven-plugin-tools.version}</version>
<executions>
<execution>
<id>help-mojo</id>
<goals>
<goal>helpmojo</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>
上述配置中:
artifactId为hello-maven-plugin,xxx-maven-plugin是官方建议的第三方Maven插件的命名方法,后续使用mvn调用该插件时可以直接使用mvn xxx(mvn hello)的简写。maven-plugin-api与maven-plugin-annotations是Maven插件的基础组件,它们是Maven插件开发的必选项,由于Maven运行过程中本身已包含对应依赖,其scope可以置为provided。maven-plugin-plugin中的helpmojo可以为自定义插件自动生成帮助文档(如:mvn jar:help),这个是可选项,即使不加也不影响插件的正常运行。
新增一个继承自AbstractMojo的HelloMojo类:
package org.example;
import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugins.annotations.Mojo;
import org.apache.maven.plugins.annotations.Parameter;
import java.util.Arrays;
@Mojo(name = "sayHello")
public class HelloMojo extends AbstractMojo {
@Parameter(property = "names", required = true)
private String[] names;
public void execute() {
getLog().info("Hello," + Arrays.toString(names));
}
}
上述类中:
@Mojo注解是Maven插件的标识,name属性指定了Maven插件的goal@Parameter注解是Maven插件参数的标识,可在使用该插件时传入自定义参数
至此,Maven插件的代码部分都写完了,使用mvn install安装它,以便在其它项目使用:
mvn clean install -DskipTests
二、使用自定义插件
在其它任意项目中引入上述自定义插件的依赖:
<project>
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.example</groupId>
<artifactId>hello-maven-plugin</artifactId>
<version>1.0-SNAPSHOT</version>
<configuration>
<names>
<name>Tom</name>
<name>Jerry</name>
</names>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>
上述配置中configuration标签下的内容将传递给插件中@Parameter对应的字段。
生成hello帮助文档:
mvn hello:help
该命令会显示当前hello插件的所有子命令,(由maven-plugin-plugin的helpmojo提供),生成结果如下:
This plugin has 2 goals:
hello:help
Display help information on hello-maven-plugin.
Call mvn hello:help -Ddetail=true -Dgoal=<goal-name> to display parameter
details.
hello:sayHello
调用hello插件的sayHello目标,触发HelloMojo(本次新增的插件功能):
mvn hello:sayHello
输出如下:
Hello,[Tom, Jerry]
输出结果与预期一致。
三、调试自定义插件
可以通过mvnDebug命令与IDEA的Remote JVM Debug实现Maven自定义插件调试。
在引入了自定义插件的项目中执行命令:
mvnDebug hello:sayHello
其会启动8000远程调试端口。
随后,在插件项目配置IDEARemote JVM Debug,将对应端口修改为8000,在execute方法上打断点,随后点击调试按钮,即可开始调试自定义插件。
参考文档