这里需要两个工程,一个是插件工程,另外一个是插件测试工程
首先介绍下插件工程:
新建一个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