自定义Maven插件

第一、自定义Maven插件概述

Mojo:Maven plain Old Java Object。每一个 Mojo 就是 Maven 中的一个执行目标(executable goal),而插件则是对单个或多个相关的 Mojo 做统一分发。

一个 Mojo 包含一个简单的 Java 类。插件中多个类似 Mojo 的通用之处可以使用抽象父类来封装。Maven插件项目的打包方式packaging必须为maven-plugin

第二、自定义插件Maven插件的实现

1、创建一个maven项目mavenplugin

2、引入maven依赖

 <!--打包方式-->
    <packaging>maven-plugin</packaging>

    <dependencies>
        <!--使用doc的方式-->
        <dependency>
            <groupId>org.apache.maven</groupId>
            <artifactId>maven-plugin-api</artifactId>
            <version>3.5.2</version>
        </dependency>
        <dependency><!--使用注解的方式-->
            <groupId>org.apache.maven.plugin-tools</groupId>
            <artifactId>maven-plugin-annotations</artifactId>
            <version>3.5.2</version>
            <scope>provided</scope>
        </dependency>
        <!-- maven 开发插件需要的依赖 end -->
        <dependency>
            <groupId>org.codehaus.plexus</groupId>
            <artifactId>plexus-utils</artifactId>
            <version>3.0.8</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-plugin-plugin</artifactId>
                <version>3.5.2</version>
                <!-- 插件执行命令前缀 -->
                <configuration>
                    <goalPrefix>mp</goalPrefix>
                    <skipErrorNoDescriptorsFound>true</skipErrorNoDescriptorsFound>
                </configuration>
                <!--执行器-->
                <executions>
                    <!--使用注解方式-->
                    <execution>
                        <!--任务Id-->
                        <id>generated-helpmojo</id>
                        <!--绑定到package生命周期阶段上 不是必须的 默认将该目标绑定至default声明周期的某个阶段,
                        这样在配置使用插件目标时,就无需声明phase,在代码里面也是可以指定的-->
                        <!--<phase>package</phase>-->
                        <goals>
                            <!-- goals里面配置的就是刚刚在@mojo里面的name -->
                            <goal>helpmojo</goal>
                        </goals>
                    </execution>
                    <!--使用文档方式-->
                    <execution>
                        <!-- 插件执行命令前缀 -->
                        <configuration>
                            <goalPrefix>api</goalPrefix>
                            <skipErrorNoDescriptorsFound>true</skipErrorNoDescriptorsFound>
                        </configuration>
                        <id>hellMojo-Demo</id>
                        <goals>
                            <goal>hellMojoDemo</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
    <!-- 自定义插件的使用示例 -->
    <!--
        maven 执行自定义插件goal命令调用的顺序有两种:
        第一种:
                groupId:artifactId:version:goal
        当前示例:com.plugin.test:maven-plugin-test:1.0:sayhi
        需要加插件(如果需要设置自定义插件依赖的参数,方可添加,否则的话,不需要添加)
                1).maven-plugin-test(自定义开发插件、设置自定义插件依赖的参数)
        第二种:
                goalPrefix:goal
        当前示例:statis:sayhi
        需要加插件
                1).maven-plugin-plugin(可以定义前缀、和goal执行时所需参数)
                2).maven-plugin-test(自定义开发插件、设置自定义插件依赖的参数)

        在例子里已经有,自行查看
    -->
    <!--<build>-->
        <!--<pluginManagement>-->
            <!--<plugins>-->
                <!--<plugin>-->
                    <!--<groupId>org.apache.maven.plugins</groupId>-->
                    <!--<artifactId>maven-plugin-plugin</artifactId>-->
                    <!--<version>3.2</version>-->
                    <!--<executions>-->
                        <!--<execution>-->
                            <!--<id>default-descriptor</id>-->
                            <!--<goals>-->
                                <!--<goal>descriptor</goal>-->
                            <!--</goals>-->
                            <!--<phase>process-classes</phase>-->
                        <!--</execution>-->
                        <!--<execution>-->
                            <!--<id>help-descriptor</id>-->
                            <!--<goals>-->
                                <!--<goal>helpmojo</goal>-->
                            <!--</goals>-->
                            <!--<phase>process-classes</phase>-->
                        <!--</execution>-->
                    <!--</executions>-->
                    <!--<configuration>-->
                        <!--<skipErrorNoDescriptorsFound>true</skipErrorNoDescriptorsFound>-->
                        <!--<goalPrefix>statis</goalPrefix>&lt;!&ndash; 插件执行命令前缀 &ndash;&gt;-->
                    <!--</configuration>-->
                <!--</plugin>-->
                <!--<plugin>-->
                    <!--<groupId>com.plugin.test</groupId>-->
                    <!--<artifactId>maven-plugin-test</artifactId>-->
                    <!--<version>1.0</version>-->
                    <!--<configuration>-->
                        <!--<age>28</age>&lt;!&ndash; goal执行所需参数指定位置,必须与goal目标的属性一致 &ndash;&gt;-->
                    <!--</configuration>-->
                <!--</plugin>-->
            <!--</plugins>-->
        <!--</pluginManagement>-->
    <!--</build>-->

3、自定义maven插件文档方式实现

/**
 * 使用文档的方式
 * @goal hellMojoDemo
 */
public class PrintMojoDemo01 extends AbstractMojo {

    /**
     * path of the classes folder.
     * @parameter expression="${classFolderPath}"
     */
    private String classFolderPath;
    /**
     * @parameter expression = "${application}"
     */
    private String application;
    @Override
    public void execute() throws MojoExecutionException, MojoFailureException {
        System.out.println(classFolderPath);
        System.out.println(application);
        System.out.println("自定义maven文档形式");
    }
}

/**
 * Mojo标注:
 * /**
 * *@goal   CustomMavenMojo:表示该插件的服务目标
 * *@phase  compile:表示该插件的生效周期阶段
 * *@requiresProject  true:表示是否依托于一个项目才能运行该插件
 * *@parameter  expression="${name}":表示插件参数,使用插件的时候会用得到
  
相关依赖:
<!--使用doc的方式-->
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-plugin-api</artifactId>
<version>3.5.2</version>
</dependency>
* */

4、自定义maven插件注解方式实现

PrintMojo继承了 AbstractMojo 这个抽象类,并实现了 execute() 方法,该方法就是用来定义这个 Mojo 具体操作内容,我们只需要根据自己的需要来编写自己的实现即可。

那么Maven 如何知道这是一个 Mojo 而不是一个普通的 Java 类呢? Mojo 的查找机制:在处理源码的时候,plugin-tools 会把使用了 @Mojo 注解或 Javadoc 里包含 @goal 注释的类来当作一个 Mojo 类。在上面的例子中,我们使用了 Javadoc 的方法来声明一个 Mojo。同样我们也可以使用 @Mojo 注解来进行声明。

/**
 *
 * @author yehui
 *
 *         该类就是maven自定义插件类
 *
 */
// mojo注解就是maven插件的注解,具体什么我忘记了。name就是后面使用该插件的时候excuation里面的,
// 后面配置的是生命周期,我这里配置了install,即默认是安装时候执行本插件(这个可以在pom文件指定)
@Mojo(name = "helpmojo",defaultPhase = LifecyclePhase.INSTALL)
public class PrintMojo extends AbstractMojo {
    // // 配置的是本maven插件的配置,在pom使用configration标签进行配置 property就是名字,
    // 在配置里面的标签名字。在调用该插件的时候会看到
    @Parameter(property = "application")
    private String application;

    @Parameter(property = "sourceFolderPath")
    private String sourceFolderPath;

    @Parameter(property = "driverName")
    private String driverName;

    @Parameter(property = "dbUrl")
    private String dbUrl;
    @Parameter(property = "dbName")
    private String dbName;
    @Override
    public void execute() throws MojoExecutionException, MojoFailureException {
        System.out.print("Hello World");
        System.out.println(application);
        System.out.println(sourceFolderPath);
        System.out.println(driverName);
        System.out.println(dbUrl);
        System.out.println(dbName);
    }
}

5、打包、安装到本地仓库

mvn clean package

猜你喜欢

转载自www.cnblogs.com/cxyyh/p/10847620.html