一、开发自定义插件

新建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>

上述配置中:

  • artifactIdhello-maven-pluginxxx-maven-plugin是官方建议的第三方Maven插件的命名方法,后续使用mvn调用该插件时可以直接使用mvn xxx(mvn hello)的简写。
  • maven-plugin-apimaven-plugin-annotations是Maven插件的基础组件,它们是Maven插件开发的必选项,由于Maven运行过程中本身已包含对应依赖,其scope可以置为provided
  • maven-plugin-plugin中的helpmojo可以为自定义插件自动生成帮助文档(如:mvn jar:help),这个是可选项,即使不加也不影响插件的正常运行。

新增一个继承自AbstractMojoHelloMojo类:

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-pluginhelpmojo提供),生成结果如下:

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方法上打断点,随后点击调试按钮,即可开始调试自定义插件。

参考文档

  1. Maven Plugin Developers Centre
  2. 如何debug(调试) maven 插件?