zoukankan      html  css  js  c++  java
  • 如何开发一个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

     

  • 相关阅读:
    POJ 3140 Contestants Division (树dp)
    POJ 3107 Godfather (树重心)
    POJ 1655 Balancing Act (树的重心)
    HDU 3534 Tree (经典树形dp)
    HDU 1561 The more, The Better (树形dp)
    HDU 1011 Starship Troopers (树dp)
    Light oj 1085
    Light oj 1013
    Light oj 1134
    FZU 2224 An exciting GCD problem(GCD种类预处理+树状数组维护)同hdu5869
  • 原文地址:https://www.cnblogs.com/liufarui/p/14000988.html
Copyright © 2011-2022 走看看