Java开发Maven插件

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

首先介绍下插件工程:

新建一个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




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值