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了

文章链接:http://www.wanghaomiao.cn/archives/10/ [复制] (转载时请注明本文出处及文章链接)

标签:maven plugin

评论已关闭