maven-自定义插件

Author Avatar
丁起男 11月 27,2020
  • 在其它设备中阅读本文章

maven-自定义插件

maven中的插件是有很多目标(goal)组成的,开发插件,实际上就是去编写插件中目标的具体代码。

每个目标对应一个java类,这个类在maven中叫做mojo,maven提供了一个mojo的接口,我们开发插件也就是去实现这个接口的方法

org.apache.maven.plugin.Mojo接口有3个方法

  1. execute:这个方法比较重要,目标的主要代码就在这个方法中实现,当使用mvn命令调用插件的目标的时候,最后具体调用的就是这个方法
  2. setLog:注入一个标准的maven日志记录器,允许这个mojo向用户传递事件和反馈
  3. getLog:获取注入的日志记录器

Log:日志记录器,这是一个日志接口,里面定义了很多方法,主要作用输出日志,比如运行mvn clean,会输出很多提示信息,这些输出信息就是通过Log来输出的

Mojo接口有个默认的抽象类:

org.apache.maven.plugin.AbstractMojo

这个类把Mojo接口中的setLog和getLog实现了,而execute方法没有实现,交给继承者去实现

具体步骤

  1. 创建一个maven构建,这个构建的packaging比较特殊,必须为maven-plugin,标识构建是一个插件类型

    <packaging>maven-plugin</packaging>
    
  2. 导入maven插件依赖(二选一)

    	<!-- doc方式 -->
    <dependency> 
        <groupId>org.apache.maven</groupId> 
        <artifactId>maven-plugin-api</artifactId> 
        <version>3.0</version> 
    </dependency> 
    	<!-- 注解方式 -->
    <dependency> 
        <groupId>org.apache.maven.plugin-tools</groupId> 
        <artifactId>maven-plugin-annotations</artifactId> 
        <version>3.4</version> 
        <scope>provided</scope> 
    </dependency>
    
  3. 创建一个目标类,需要继承AbstractMojo或实现Mojo

  4. 目标类中添加注解

    @org.apache.maven.plugins.annotations.Mojo(name="目标名称")
    

    或者在类上添加注释

    	/**
    	* @goal 目标名称
    	*/
    
  5. 在目标类的execute方法中实现具体的逻辑,并且可以通过getLog().info()方法输出日志

  6. 安装插件到本地仓库

    mvn clean install
    
  7. 注册插件在settings.xml中添加配置

    	<pluginGroups>
    		<pluginGroup>插件的groupId</pluginGroup>
    	</pluginGroups>
    
  8. 使用插件,执行命令mvn 插件前缀:目标名称,或者配置到buidl标签里

    		<build>
        <plugins>
            <plugin>
                <!--插件坐标-->
                <groupId>com.dqn.maven</groupId>
                <artifactId>my-maven-plugin</artifactId>
                <version>1.0-SNAPSHOT</version>
                <executions>
                    <execution>
                        <id>my-plugin</id>
                        <!--绑定生命周期-->
                        <phase>clean</phase>
                        <!--执行目标-->
                        <goals>
                            <goal>dqn</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
    

    maven会根据插件的artifactId来识别插件前缀

    • 前置匹配:${前缀}-maven-plugin,如果artifactId是hello-maven-plugin,则前缀是hello
    • 中间匹配:maven-${前缀}-plugin,如果artifactId是maven-hello-plugin,则前缀是hello

参数

@Parameter注解将变量标识为mojo参数

  • defaultValue:定义变量的默认值
  • property:为-D参数名=参数值设置参数名

使用这通过:

  1. pom文件:

    <configuration> 
        <参数名>参数值</参数名> 
    </configuration>
    
  2. mvn命令:

    mvn ... -D参数名=参数值