maven自定义插件

前言

      公司项目需要发布link文件到tomcat服务的指定目录下,目前前辈们写的插件都是eclipse插件版本,研究下maven 插件实现提供给maven项目使用。

基本准备

  1. maven 将每一个插件的goal定义为mojo(Maven plain Old Java Object),每一个插件定义需要实现Mojo的字类
  2. 在mojo里面获取pom的定义可以通过@Parameter注解自动注入
  3. 几个默认的pom 对象:
  • ${project.basedir} 项目的根目录
  • ${project.build.finalName} 项目最终的打包名称

实现方式

1 新建一个maven项目,将打包方式修改为

<packaging>maven-plugin</packaging>
复制代码

2、pom 添加build 依赖

<dependencies>
    <dependency>
        <groupId>org.apache.maven</groupId>
        <artifactId>maven-plugin-api</artifactId>
        <version>3.5.0</version>
    </dependency>
    <dependency>
        <groupId>org.apache.maven.plugin-tools</groupId>
        <artifactId>maven-plugin-annotations</artifactId>
        <version>3.5</version>
        <scope>provided</scope>
    </dependency>
</dependencies>

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.8.0</version>
            <configuration>
                <source>1.8</source>
                <target>1.8</target>
            </configuration>
        </plugin>
    </plugins>
</build>
复制代码

3、编写mojo实现

@Mojo(name = "deploy-link")
public class DeployLinkMojo extends AbstractMojo {

    private NetilerProjectHandle project;

    @Parameter(required = true)
    private String serverPath;

    @Parameter(defaultValue = "${project.basedir}")
    private String projectPath;

    @Parameter(defaultValue = "${project.build.finalName}")
    private String finalName;

    /**
     * created by vision 2021-10-9 发布link文件的具体实现
     * @throws MojoExecutionException
     * @throws MojoFailureException
     */
    @Override
    public void execute() throws MojoExecutionException, MojoFailureException {
        System.out.println("start execute project : " + projectPath);
        project = new NetilerProjectHandle(serverPath, projectPath, finalName);
        //删除相关jar与link文件
        project.deleteRelateFile();
        //写文件
        project.createLinkFile();

    }
}
复制代码

注意点:

@Mojo 代表插件的执行目标

@Parameter 代表参数,可以获取pom文件的定义

execute() 插件目标的具体实现

其他项目在pom-build 引用:

<plugin>
   <groupId>com.leadal</groupId>
   <artifactId>maven-plugin-netiler</artifactId>
   <version>1.0-SNAPSHOT</version>
   <configuration>
      <serverPath>D:\work\servers\leadal_kms-tomcat_8.5</serverPath>
      <projectPath>${project.basedir}</projectPath>
   </configuration>
</plugin>
复制代码

在idea下面使用:

                  

遇到的问题

1、插件实现获取不到项目根目录,因为此插件需要项目根目录写到tomcat运行目录下,通过 @Parameter(defaultValue = "${project.basedir}") private String projectPath; 的方式在mojo里面获取到的值为null

多项尝试后发现这个属性需要在pom里面显示调用 ${project.basedir}

<plugin>
    <groupId>com.leadal</groupId>
    <artifactId>maven-plugin-netiler</artifactId>
    <version>1.0-SNAPSHOT</version>
    <configuration>
        <serverPath>D:\work\servers\leadal_kms-tomcat_8.5</serverPath>
        <projectPath>${project.basedir}</projectPath>
    </configuration>
</plugin>
复制代码

但是 ${project.build.finalName} 就可以直接获取到,这个可能和内部实现有关,不做深究。