• 如何开发一个maven插件


    maven是当下最流行的项目管理工具,其丰富的插件为我们的工作带来了很大的便利。

    但是在一些情况下,开源的插件并不能完全满足我们的需求,我们需要自己创建插件,本文就从0开始带大家一起创建自己的插件。

    【命名规范】

      首先,官方的命名规范是maven-xxx-plugin,为了避免于官方冲突,我们可以将自己的插件命名为xxx-maven-plugin

    【创建插件项目】

    本项目使用idea创建

    我们首先需要创建一个Mojo(Maven plain Old Java Object)工程,如下图:

     

     然后填写我们的项目名以及groupId:

     

    然后我们可以设置自己的maven目录和settings的目录:

     

    然后咱们可以看到项目下有一个默认创建的类MyMojo:

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

     

    类里面默认实现了一个方法,可以创建一个文件,咱们为了理解起来更简单一点,修改得更简单一些:

     

     我们依次解释一下图中红框框住的四个部分:

      1. @goal------自定义 Maven 插件 Mojo 代码中唯一必须声明的标记,用来声明该 Mojo 的目标名称。
      2. @phase------默认将该目标绑定到 default 生命周期的某个阶段。

    图中的生命周期为程序运行期间。

      1. 每个Mojo类都需要继承AbstractMojo ,并实现其execute()方法
      2. getLog()是Mojo类默认的日志操作方法,直接调用可以使其在控制台输出相应内容。

    【使用插件】

    在test-maven-plugin中执行:

    mvn clean install

     

    执行成功之后,可以去本地库里面查看到生成的包:

     

    然后我们打开另外一个项目,并在pom文件中添加:

    <build>

        <plugins>

            <plugin>

                <groupId>com.github.liufarui</groupId>

                <artifactId>demo-maven-plugin</artifactId>

                <version>0.0.1-SNAPSHOT</version>

            </plugin>

        </plugins>

    </build>

    然后执行:

    mvn clean package

    这时我们可以在右侧maven管理中看到我们的插件:

     

    双击即可运行,可以在控制台看到我们的运行结果:

    其实就是简单地打印了一句话。

    我们也可以在项目下执行(由于我们的项目名符合XXX-maven-plugin规范,所以可以省略maven-plugin):

    mvn demo:hello

    也可以得到同样的效果。

     

    完整的命令格式为:

    mvn groupId:artifactId:version:goal

    即:

     

    【Mojo配置方式】

    Mojo的配置有两种方式:

    一种是JavaDoc + Tag,即上面的示例代码所使用的方式。

    另一种是注解,使用@Mojo, @Parameter等annotation来配置。

    下面简单解释一下各个标记的含义:

    @goal<name>

    自定义 Maven 插件 Mojo 代码中唯一必须声明的标记,用来声明该 Mojo 的目标名称。

    @phase<name>

    默认将该目标绑定到 default 生命周期的某个阶段。
    这样在配置使用该插件目标时就可以不声明 phase。

    @requiresDependecyResolution<scope>

    声明运行该 Mojo 之前必须解析哪些范围的依赖。

    @requiresProject<true/false>

    声明该目标是不是必须在一个 Maven 项目中运行,默认值是true。

    @requiresDirectInvoction<true/false>

    声明该目标是否只能使用命令行调用,默认值是 false,既可以在命令行中调用,也可以在 pom 中配置绑定生命周期阶段。

    @requiresOnline<true/false>

    声明 Maven 是不是必须是在线状态,默认值是 false。

    @requiresReport<true/false>

    声明是否要求项目报告已经生成,默认值是 false。

    @aggregator

    在多模块的 Maven 项目中,声明该目标是否只在顶层模块构建的时候执行。

    @execute goal="<goal>"

    声明执行该目标之前,先执行指定的目标。

    如果该目标是自己插件的另外一个目标,直接 goal="目标名"。

    如果该目标是另外一个插件的目标,就需要写成 goal="目标前缀:目标名"。

    @execute phase="<phase>"

    声明在执行该目标之前,Maven 先运行到当前生命周期的指定阶段。

    @execute lifecycle="<lifecycle>"phase="<phase>"

    声明在执行该目标之前,Maven 运行到指定生命周期的指定阶段。


    【使用注解开发Mojo】

    首先添加依赖:

    <dependency>

        <groupId>org.apache.maven.plugin-tools</groupId>

        <artifactId>maven-plugin-annotations</artifactId>

        <version>3.6.0</version>

    </dependency>

    需要指定maven-plugin-plugin的版本,否则有可能因为默认的maven-plugin-plugin版本过低,导致不能识别注解:

    <build>

        <plugins>

            <!-- 指定maven-plugin-plugin版本,默认版本过低,可能无法识别注解 -->

            <plugin>

                <groupId>org.apache.maven.plugins</groupId>

                <artifactId>maven-plugin-plugin</artifactId>

                <version>3.6.0</version>

            </plugin>

        </plugins>

    </build>

     

    然后创建新的类,继承AbstractMojo,使用注解,如下:

     

    然后执行mvn clean install,并在hello-world项目中运行插件:

     

    【问题】

    在项目文件夹之外运行插件的时候,可能会遇到以下问题:

    Goal requires a project to execute but there is no POM in this directory (D: estcode-demo). Please verify you invoked Maven from the correct directory. -> [Help 1]

    此时,需要指定以下参数使插件可以脱离项目单独执行:

    requiresProject = false

    结果:

     

    【demo地址】

    以上,即是整个maven-plugin入门开发内容,为了方便大家查看学习,我把demo项目放到了我的github上,大家可以自行查看:

     

    https://github.com/liufarui/code-demo

     

  • 相关阅读:
    Jenkins知识地图
    PageObject&PageFactory
    robot framework-databaselibaray库使用(python)
    robot framework环境搭建
    使用instantclient_11_2 和PL/SQL Developer工具包连接oracle 11g远程数据库(转)
    (转)pip和easy_install使用方式
    图解:如何在LINUX中安装VM-Tools
    ANT简明教程[转载]
    Linux常用命令
    oracle数据分组
  • 原文地址:https://www.cnblogs.com/liufarui/p/14000988.html
Copyright © 2020-2023  润新知