Java开发Maven插件

来源:互联网 发布:淘宝网购物压缩袋 编辑:程序博客网 时间:2024/06/06 05:26

这里需要两个工程,一个是插件工程,另外一个是插件测试工程

首先介绍下插件工程:

新建一个web项目,名称为myMavenPlugin,pom文件对该工程的相关配置信息为(注意这是关于项目自身的信息):

<groupId>org.apache.maven.plugins</groupId>  <artifactId>my-maven-plugin</artifactId>  <version>1.0.1-SNAPSHOT</version>  <packaging>maven-plugin</packaging>  <name>my-maven-plugin</name>  <url>http://maven.apache.org</url>  <properties>    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>  </properties>

可以看到这个项目的groupId以及artifactId,重点是打包方式必须是maven-plugin

另外要注意:artifactId的格式必须是xxxx-maven-plugin的格式


接下来还需要在pom文件中添加开发maven插件需要的jar包:

<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>

接下来就是我们的核心Mojo类了,代码如下:

package org.apache.maven.plugins;import org.apache.maven.plugin.AbstractMojo;import org.apache.maven.plugin.MojoExecutionException;import org.apache.maven.plugin.MojoFailureException;import org.apache.maven.plugins.annotations.Mojo;import org.apache.maven.plugins.annotations.Parameter;/** * Hello world! * */@Mojo(name = "hello")//Mojo的名称public class HelloMojo extends AbstractMojo {//Mojo的参数,可以在使用插件的项目中配置    @Parameter(property = "test.word.test", defaultValue = "nothing")    private String word;    //执行hello插件时候就执行execute方法     public void execute() throws MojoExecutionException, MojoFailureException {        getLog().info("hello word.");        getLog().info(this.word);    }}

property参数支持引用用户在命令行中通过-D指定的系统属性。

这个类必须继承AbstractMojo,并实现execute方法,上面的@Mojo注解定义了这个Mojo的名称,类的属性word是将要从插件使用方传递过来的参数

当名称为hello的插件任务被执行的时候,需要传递word参数,插件就会执行execute方法,当然这里只是做了一些打印



当然,我们还可以新建一个名称为welcome的Mojo类

package org.apache.maven.plugins;import org.apache.maven.plugin.AbstractMojo;import org.apache.maven.plugin.MojoExecutionException;import org.apache.maven.plugin.MojoFailureException;import org.apache.maven.plugins.annotations.Mojo;import org.apache.maven.plugins.annotations.Parameter;/** * Hello world! * */@Mojo(name = "welcome")public class WelcomeMojo extends AbstractMojo {//Mojo的参数,可以在使用插件的项目中配置    @Parameter(property = "sentence", defaultValue = "nothing")    private String sentence;    public void execute() throws MojoExecutionException, MojoFailureException {        getLog().info("welcome.");        getLog().info(this.sentence);    }}


然后说下测试插件的工程:

新建一个web工程,名称为MyMavenPluginTest,在pom文件中添加如下对于插件的配置:

<build>    <plugins>      <plugin>        <groupId>org.apache.maven.plugins</groupId>        <artifactId>my-maven-plugin</artifactId>        <version>1.0.1-SNAPSHOT</version>        <!--配置执行这个插件的时间,即配置插件的生命周期-->        <!--这里是配置在项目的compile编译器时执行插件的名称为hello的Mojo的execute方法-->        <executions>          <execution>            <id>hello</id>            <phase>compile</phase>            <goals>              <goal>hello</goal>            </goals>            <!--给插件Mojo传参数,word="i love you"-->            <!--<configuration>-->              <!--<word>i love you</word>-->            <!--</configuration>-->          </execution>          <execution>            <id>welcome</id>            <phase>install</phase>            <goals>              <goal>welcome</goal>            </goals>            <!--<configuration>-->              <!--<sentence>i hate you</sentence>-->            <!--</configuration>-->          </execution>        </executions>        <configuration>          <word>i love you</word>          <sentence>i hate you</sentence>        </configuration>      </plugin>    </plugins>  </build>

这里是对同一个插件配置了两个任务,但是注意,参数配置是在<configuration>标签中,我上述的configuration是在plugin标签下,这是对插件全局任务的配置,这个配置对my插件下的所有Mojo任务都有效,这种方式参数传递正常

但是如果要对插件的每个任务分别配置参数怎么办呢?网上说应该将configuration标签放在execution标签中,但是我这样配置发现根本就是传不进去,至今还没找到原因


下面就是在我的测试项目中执行插件,有两种方式执行:

1.   在idea的右侧点击“Maven Projects”,  在Plugins下可以看到刚配置的插件,名称为my,这个名称就是插件artifactId的前缀,my下可以看到两个任务

       my:hello和my:welcome,双击就可以分别执行

2. 命令行执行mvn命令

#mvn  my:hello

#mvn  my:welcome

命令行方式执行,也可以通过-D来传参:

#mvn  my:hello  -Dtest.word.test=hahahahaha

但是如果已经在configuration标签中配置了参数,则configuration中的参数优先,如果configuration中没有配置参数,则-D指定的参数有效


注意Mojo类中属性的配置:

@Parameter(property = "test.word.test", defaultValue = "nothing")private String word;

property参数配置的值是在通过命令行执行mvn命令时用-D指定参数时使用的,具体说明如下

如果通过xml文件配置传参数,则是如下配置:

<configuration>             <word>i love you</word></configuration>
这里word标签名字只需要与Mojo类的属性(private String word)名称一致即可

如果通过命令行执行mvn命令,则可以通过-D指定参数,参数名称与上述property配置的值要一致(test.word.test),即为如下方式:

#mvn  my:hello  -Dtest.word.test=hahahahaha




原创粉丝点击