Maven Plugin Dev
2017年9月29日大约 3 分钟
Maven Plugin
Mvn Plugin 对于使用 maven 的人来说并不陌生,我们如何编写自己的插件呢?
- Mojo
A mojo is a Maven plain Old Java Object. Each mojo is an executable goal in Maven, and a plugin is a distribution of one or more related mojos.
Quick Start
下面是一个简单的例子。
Create
本文使用 IDE,可以直接通过项目原型创建。
【New Project】=>【Maven】=>【maven-archetype-mojo】
勾选 Create from archetype
则会自动创建一个基础的 Mojo 项目。
其实项目添加的文件也很简单,本文简化一下创建如下:
- project struct
│ pom.xml
│
└─src
└─main
└─java
└─com
└─ryo
MyMojo.java
- pom.xml
4.0.0
com.ryo
mvn-plugin
maven-plugin
1.0-SNAPSHOT
mvn-plugin Maven Mojo
http://maven.apache.org
org.apache.maven
maven-plugin-api
2.0
- MyMojo.java
touch 就是我们插件的名称。
import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugin.MojoExecutionException;
/**
* Goal which touches a timestamp file.
*
* @goal touch
* @phase process-sources
*/
public class MyMojo extends AbstractMojo {
public void execute()
throws MojoExecutionException {
System.out.println("------------------------------------ Hello Mvn Plugin!");
}
}
这就创建完成了。
Install
运行命令,将插件安装到本地。
$ mvn clean install
安装完成之后,我们就可以在其他项目,或者是当前项目使用了。
在 pom.xml
添加内容如下:
com.ryo
mvn-plugin
1.0-SNAPSHOT
Run
- 直接点击运行

- 通过命令
实际上面的操作是运行了如下命令:
$ mvn com.ryo:mvn-plugin:1.0-SNAPSHOT:touch
运行结果:
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building mvn-plugin Maven Mojo 1.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- mvn-plugin:1.0-SNAPSHOT:touch (default-cli) @ mvn-plugin ---
------------------------------------ Hello Mvn Plugin!
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 0.186 s
[INFO] Finished at: 2017-09-29T18:30:50+08:00
[INFO] Final Memory: 8M/184M
[INFO] ------------------------------------------------------------------------
LifeCycle
如果我们想让插件在 mvn 某个生命周期运行,应该怎么办呢?
如下,则指定 mvn 编译时运行当前插件。
com.ryo
mvn-plugin
1.0-SNAPSHOT
compile
touch
- Test
运行命令:
$ mvn clean compile
结果:
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building mvn-plugin Maven Mojo 1.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ mvn-plugin ---
[INFO] Deleting D:\CODE\mvn-plugin\target
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ mvn-plugin ---
[WARNING] Using platform encoding (GBK actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] skip non existing resourceDirectory D:\CODE\mvn-plugin\src\main\resources
[INFO]
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ mvn-plugin ---
[INFO] Changes detected - recompiling the module!
[WARNING] File encoding has not been set, using platform encoding GBK, i.e. build is platform dependent!
[INFO] Compiling 1 source file to D:\CODE\mvn-plugin\target\classes
[INFO]
[INFO] --- mvn-plugin:1.0-SNAPSHOT:touch (default) @ mvn-plugin ---
------------------------------------ Hello Mvn Plugin!
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1.445 s
[INFO] Finished at: 2017-09-29T18:33:50+08:00
[INFO] Final Memory: 13M/185M
[INFO] ------------------------------------------------------------------------
Annotation
上面是基于 doc 来完成的。个人更倾向于注解的方式。
二者不要同时使用,个人测试会报错。
- 引入 jar
org.apache.maven
maven-plugin-api
3.0
org.apache.maven.plugin-tools
maven-plugin-annotations
3.4
provided
- 定义 MOJO
@Mojo(name = "doc")
public class DocMojo extends AbstractMojo {
public void execute() throws MojoExecutionException, MojoFailureException {
System.out.println("------------------------------------ Hello Mvn Plugin!");
}
}
对于参数的传入
- xml 配置如下:
com.github.houbb
maven-doc-plugin
1.0-SNAPSHOT
root
- Mojo
@Mojo(name = "doc")
public class DocMojo extends AbstractMojo {
/**
* 用户名称
*/
@Parameter
private String username;
public void execute() throws MojoExecutionException, MojoFailureException {
System.out.println("------------------------------------ Hello Mvn Plugin!");
System.out.println("username: "+username);
}
}
贡献者
binbin.hou