maven plugin开发
需要
至少需要下面这些依赖
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-plugin-api</artifactId>
<version>3.0.3</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.maven.plugin-tools</groupId>
<artifactId>maven-plugin-annotations</artifactId>
<version>3.2</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-core</artifactId>
<version>3.0.3</version>
</dependency>
例子说明
@Mojo(name = "cmd") //这里决定了maven插件的执行命令,本例的插件执行命令就是 hello:cmd ,即 {className}:{Mojo.name()} ,首字母小写
public class Hello extends AbstractMojo {
@Parameter(required = true)
//用来接收pom.xml中配给次插件的参数,`required`代表此参数为必须设置。
private String paramA;
@Parameter(defaultValue="${project.build.sourceDirectory}")
//`defaultValue`代表这个参数不是必须赋值的,可以使用默认值,${project.build.sourceDirectory}是maven的内置变量
private String srcFolder;
@Override
public void execute() throws MojoExecutionException, MojoFailureException {
//do something
}
}
关于maven的内置变量可以参考这个,他列的还是比较详细的maven 内置变量,当然也可以再自行搜索查看。
使用如下的方式设置插件成员变量的值
<plugin>
<groupId>sample.plugin</groupId>
<artifactId>hello-maven-plugin</artifactId>
<version>1.0-SNAPSHOT</version>
<configuration>
<paramA>Welcome</paramA> //设置自定义的plugin参数
</configuration>
</plugin>
问题备忘
在maven plugin 执行时加载项目中class时报ClassNotFound
这是因为plugin的classloader不包含当前工程的依赖也不包含工程输出目录,所以自然就扫不到。具体可以参考官网:Guide to Maven Classloading
首先插件需指定requiresDependencyResolution= ResolutionScope.RUNTIME
,如@Mojo(name = "gentf",requiresDependencyResolution= ResolutionScope.RUNTIME)
然后定义@Parameter(defaultValue ="${project}",readonly = true)
private MavenProject project;
这样就可以通过project
拿到项目的class
环境,如果想加载对应的class
需要new
一个新的classloader
以包含整个项目环境。public ClassLoader getNewClassLoad(MavenProject project) throws DependencyResolutionRequiredException, MalformedURLException { List<String> cls = project.getCompileClasspathElements(); URL[] runtimeUrls = new URL[cls.size()]; for(int i=0;i<cls.size();i++){ runtimeUrls[i] = new File(cls.get(i)).toURI().toURL(); } URLClassLoader newLoader = new URLClassLoader(runtimeUrls,Thread.currentThread().getContextClassLoader()); return newLoader; }
这个新创建的
classloader
就可以加载项目工程中的class了