一、开发自定义插件
新建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
方法上打断点,随后点击调试按钮,即可开始调试自定义插件。
参考文档