Maven3.x 插件开发入门

发布时间:2019-09-02 07:42:39编辑:auto阅读(1476)

      1、创建插件项目:(项目原型选择插件类型)

      11.png

      2、Artifact Id 以xxx-maven-plugin命名,如:gr-maven-plugin,下面Version的内容无所谓。

      

      3、创建完毕之后的结构是这样:

      

      4、修改pom.xml文件,加上2个依赖:分别是maven-plugin-api和maven-plugin-annotations,前者是插件开发API,后者是插件中使用的注解定以的包,注意打包方式为:<packaging>maven-plugin</packaging>。完整的pom.xml文件如下,一定要把自动生成那些没用的东西删掉,只留下下面的内容,否则运行插件的时候有可能报错。


    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>com.mook.plugin</groupId>
        <artifactId>gr-maven-plugin</artifactId>
        <version>1.0-RELEASE</version>
        <packaging>maven-plugin</packaging>
    
        <properties>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        </properties>
    
        <dependencies>
            <dependency>
                <groupId>org.apache.maven</groupId>
                <artifactId>maven-plugin-api</artifactId>
                <version>2.0</version>
            </dependency>
            <dependency>
                <groupId>org.apache.maven.plugin-tools</groupId>
                <artifactId>maven-plugin-annotations</artifactId>
                <version>3.2</version>
                <scope>provided</scope>
            </dependency>
        </dependencies></project>


      5、删掉默认的包,自己新建一个包com.mook.plugin.gr,在这个包下面创建一个类叫做Car,继承AbstractMojo类。重写里面的execute方法。如下:


    @Mojo(name = "drive")public class Car extends AbstractMojo {
    
        @Override    public void execute() throws MojoExecutionException, MojoFailureException {
            System.out.println("Car drive...");
        }
    
    }


      6、这样插件就开发完成了。我们将插件install到本地仓库。然后在项目组引入,可以是在本插件项目中引入,也可以在其他项目中引入。


        <build>
            <plugins>
                <plugin>
                    <groupId>com.mook.plugin</groupId>
                    <artifactId>gr-maven-plugin</artifactId>
                    <version>1.0-RELEASE</version>
                </plugin>
            </plugins>
        </build>


      7、使用eclipse的Maven插件来运行,这里的Maven插件实质Eclipse的Maven插件,而不是Maven自己的插件。如下:

      

      8、输出结果:Car drive...结果显然是正确的。

      

      9、这里来解释下里面有几个细节。

        1、插件artifactId为什么使用xxx-maven-plugin(或者xxx-plugin-maven),这个是约定的,如果这样命名,在启动插件的时候就可以像上面那样gr:drive。否则就的把gr改成groupId:artifactId:version:xxx这种方式,很不方便,当然也有另外的方式处理,在settings文件里面增加pluginManageMent内容,也能实现简化写法。(这个地方改一下,在我们的pom.xml文件中,plugins下面的maven-plugin-plugin中的<goalPrefix>标签下是可以配置这个前缀名称的,比如我这里配置co,那么启动就是co:drive),如下:


                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-plugin-plugin</artifactId>
                    <version>3.2</version>
                    <configuration>
                        <goalPrefix>co</goalPrefix>
                        <skipErrorNoDescriptorsFound>true</skipErrorNoDescriptorsFound>
                    </configuration>
                    <executions>
                        <execution>
                            <id>mojo-descriptor</id>
                            <goals>
                                <goal>descriptor</goal>
                            </goals>
                        </execution>
                        <execution>
                            <id>help-goal</id>
                            <goals>
                                <goal>helpmojo</goal>
                            </goals>
                        </execution>
                    </executions>
                </plugin>


     

        2、注解@Mojo是必须要的,这是定义插件对象的启动方法,由于该类只有一个方法,所以启动方法和启动类是一致的。在Maven 3之前是使用注释注解:@goal xxx这种方式。现在已经不使用这种方式了。

        3、我们平时在使用Maven的各种插件的时候往往都能在配置文件中传入属性的值,比如tomcat-maven-plugin插件我们可以随意指定tomcat的端口号。这里插件的处理方式是在Car类中定义一些属性,比如下面这样。然后我们重新将插件install到本地仓库。再次运行。


    @Mojo(name = "drive")public class Car extends AbstractMojo {
        
        @Parameter(defaultValue = "8080")    private Integer port;
        
        @Override    public void execute() throws MojoExecutionException, MojoFailureException {
            System.out.println("Car drive...");
            System.out.println(port);
        }
    
    }


        输出结果:

        

        那么,在插件的配置中增加Configuration标签,加上子标签<port>,如下:


                <plugin>
                    <groupId>com.mook.plugin</groupId>
                    <artifactId>gr-maven-plugin</artifactId>
                    <version>1.0-RELEASE</version>
                    <configuration>
                        <port>8090</port>
                    </configuration>
                </plugin>


        那么,结果就是8090,这就是插件的参数设置方式。

        

      10、到这里基本上就介绍完了。关于插件的运行,关系到Maven的生命周期,阶段和目标这几个概念。这是另外一个话题了。



    在POM配置Maven plugin提示错误“Plugin execution not covered by lifecycle configuration”的解决方案

    eclipse在其POM文件的一处提示出错如下:

    Plugin execution not covered by lifecycle configuration: org.apache.maven.plugins:maven-plugin-plugin:3.2:descriptor (execution: default-descriptor, phase: generate-resources)pom.xml/gr-maven-pluginline 92Maven Project Build Lifecycle Mapping Problem

     

    这表示m2e在其执行maven的生命周期管理时没有定义该插件,所以提示出错,其实m2e对此是提供了扩展机制的,我们可以通过如下操作来消除这个出错提示:

    1. 进入Window—>Preferences—>Maven配置,进入Lifecycle Mapping设置项,如下图:

       

       从上图可以看出m2e管理maven生命周期的文件名是lifecycle-mapping-metadata.xml,以及该文件的存放路径

    2. 下一步我们就要去相应路径修改lifecycle-mapping-metadata.xml文件,但会发现这个文件在上图中提示的位置并不存在,那么此时就

    以到eclipse的安装目录下的plugins下的org.eclipse.m2e.lifecyclemapping.defaults_xxxxxx.jar文件中找到该文件(如下图):

     

    通过解压软件可以发现lifecycle-mapping-metadata.xml文件的确在jar包中,把它从jar包中解压出来并放置到前图所示的路径下

    3. 打开lifecycle-mapping-metadata.xml文件,把未识别的插件在文件中加入即可:

    <pluginExecution>
          <pluginExecutionFilter>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-plugin-plugin</artifactId>
            <goals>
              <goal>descriptor</goal>
            </goals>
            <versionRange>[3.2,)</versionRange>
          </pluginExecutionFilter>
          <action>
            <execute>
              <ignore />
            </execute>
          </action>
        </pluginExecution>

    4.修改完成后,需在m2e配置处把“Update Maven projects on startup”选项勾上,并重启eclipse即可消除出错示。


关键字