重要声明:插件命名规范和Apache Maven商标
通常将你的插件命名为
强烈反对命名为maven-
一: 知识要点
Maven为我们提供了丰富的插件资源,使得开发调试过程中非常方便,可以满足大多数场景下的需求。当然有时候,我们也需要根据需求定制自己的插件。下面是在开发Maven插件时的一点备忘录,具体的开发流程请Google,有不少的教程,这里只是概述一下,同时记录一些容易掉坑的点。
1,Maven的工具由一个又一个的插件组成的,插件类继承了AbstractMojo类,需要覆写execute方法。getLog()获取的是AbstractMojo内部的log,类型是:org.apache.maven.plugin.logging.Log; 在Mojo的开发中,不要使用其他的Log基础设施。注: Mojo = Maven Old Java Object;
2,pom.xml文件中,打包(packaging)类型应该为 maven-plugin,而不是war/jar。同时需要依赖的两个核心依赖是:
maven-plugin-api:这是插件开发的api;
maven-plugin-annotations:这是进行插件注解的api。
3,开发Maven插件和开发普通的Maven工程的流程是一样的,不同在于插件的 archetype应该设置为:maven-archetype-plugin;
4,插件的入口类为继承了AbstractMojo的实现类,但是需要进行注解。注解@Mojo是必须要的,这是定义插件对象的启动方法,由于该类只有一个方法,所以启动方法和启动类是一致的。在Maven 3之前是使用注释注解:@goal doSomething这种方式。现在已经不使用这种方式了。举个例子,如果进行如下标注:
@Mojo( name = "doSomething")
public class GreetingMojo extends AbstractMojo{
...
}
mvn groupId:artifactId:version:doSomething //如果一个项目中只version时,则version可以省略,只有一个@Mojo标记,估计后面的Mojo名称估计可以省略。
5,除了标注执行的方法,还可对成员变量进行标注,以便自动获取或由用户传入参数。
<build>
<plugins>
<plugin>
<groupId>com.imddy.plugin</groupId>
<artifactId>ddyhello-maven-plugin</artifactId>
<version>0.0.1-SNAPSHOT</version>
<configuration>
<port>8090</port>
</configuration>
</plugin>
</plugins>
</build>
6,每个Mojo(由@Mojo标注)都有生命周期,即该Mojo的执行时间。用户可以选择将某个插件目标绑定到生命周期的某个阶段,从而让构建过程更为完善。生命周期的具体介绍参考文末给出的文章。下面将插件配置到编译阶段执行:
<build>
<plugins>
<plugin>
<groupId>sample.plugin</groupId>
<artifactId>doSomething-maven-plugin</artifactId>
<version>1.0-SNAPSHOT</version>
<executions>
<execution>
<phase>compile</phase>
<goals>
<goal>doSomething</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
二: 实行过程
新建 maven-archetype-plugin的maven项目
选择好项目的ArifactId, xxxx-maven-plugin
项目会知道安装maven-tools工具
会自动生成
package com.imddy.plugin.ddyhello_maven_plugin;
import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugins.annotations.LifecyclePhase;
import org.apache.maven.plugins.annotations.Mojo;
import org.apache.maven.plugins.annotations.Parameter;
import org.apache.maven.plugins.annotations.ResolutionScope;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
/**
* Goal which touches a timestamp file.
*
* @deprecated Don't use!
*/
@Mojo(name = "touch", defaultPhase = LifecyclePhase.PROCESS_SOURCES)
public class MyMojo extends AbstractMojo {
/**
* Location of the file.
*/
@Parameter(defaultValue = "${project.build.directory}", property = "outputDir", required = true)
private File outputDirectory;
public void execute() throws MojoExecutionException {
File f = outputDirectory;
if (!f.exists()) {
f.mkdirs();
}
File touch = new File(f, "touch.txt");
FileWriter w = null;
try {
w = new FileWriter(touch);
w.write("touch.txt");
} catch (IOException e) {
throw new MojoExecutionException("Error creating file " + touch, e);
} finally {
if (w != null) {
try {
w.close();
} catch (IOException e) {
// ignore
}
}
}
}
}
上面这个是自动生成的一个代码,使用了Mojo注解为touch
当我们使用
com.imddy.plugin:ddyhello-maven-plugin:touch
这是在另一个项目的测试结果为
除了默认的,我可以自己手动写的代码如下:
package com.imddy.plugin.ddyhello;
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;
@Mojo(name = "drive")
public class Car extends AbstractMojo {
@Parameter(defaultValue = "8080")
private Integer port;
public void execute() throws MojoExecutionException, MojoFailureException {
getLog().info( "Hello, world." );
System.out.println("Car drive...");
System.out.println(port);
}
}
1 getLog().info()这个是日志输出,写maven最好不要使用其它的日志。
2 @Parameter(defaultValue = “8080”)
private Integer port;
Paramter可以用来设置参数这个参数也可以在pom.xml中配置
<build>
<plugins>
<plugin>
<groupId>com.imddy.plugin</groupId>
<artifactId>ddyhello-maven-plugin</artifactId>
<version>0.0.1-SNAPSHOT</version>
<configuration>
<port>8090</port>
</configuration>
</plugin>
</plugins>
</build>
不配置会输出默认值。
使用命令如下:
com.imddy.plugin:ddyhello-maven.plugin:driver
如果插件需要绑定在某个阶段
<build>
<plugins>
<plugin>
<groupId>com.imddy.plugin</groupId>
<artifactId>ddyhello-maven-plugin</artifactId>
<version>0.0.1-SNAPSHOT</version>
<configuration>
<port>8090</port>
</configuration>
<executions>
<execution>
<phase>compile</phase>
<goals>
<goal>doSomething</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>