如何以编程方式调用maven-resources-plugin

时间:2014-03-11 21:49:01

标签: java maven maven-plugin

我正在编写一个自定义Maven插件,插件的部分工作是过滤复制一些资源。

我写的代码如下:

CopyResourcesMojo rm = new CopyResourcesMojo();             
rm.setOutputDirectory(outputDir); //determined dynamically in a loop
rm.setOverwrite(true);
rm.setFilters(filters);  //determined dynamically in a loop
rm.setResources(this.resources);  //Actually is of type List<Resource>
rm.execute(); //NulPointerException because rm's project member is null.

这会引发NullPointerException,因为CopyResourceMojo无法访问我的mojo project,而CopyResourceMojo没有setProject()方法我可以用。

已经使用mojo-executor-maven-plugin进行了调查。我遇到的问题是使用这个库来调用插件涉及编写反映该插件的XML配置的代码。我的插件会收到一个资源列表(就像maven-resources-plugin那样),所以如果我要使用mojo-executor-maven-plugin,我想我必须编写代码来评估包含和排除。我希望为此使用maven-resources-plugin,以便该行为与将资源列表作为参数的其他插件100%一致。

有没有其他方法可以从代码中调用插件,或者将项目注入另一个mojo?或者其他一些方法来实现这个目标?

2 个答案:

答案 0 :(得分:2)

我最终使用MavenResourcesFiltering和MavenResourcesExecution找到了一种方法。文件在这里:http://maven.apache.org/shared/maven-filtering/usage.html

我能够让这段代码做我想做的事情:

/* Class members */
@Parameter(defaultValue="${project}",required=true, readonly=true)
protected MavenProject project;

@Parameter( defaultValue = "${session}", required = true, readonly = true )
protected MavenSession session;

@Component( role=org.apache.maven.shared.filtering.MavenResourcesFiltering.class, hint="default")
protected MavenResourcesFiltering mavenResourcesFiltering;

@Parameter( property = "encoding", defaultValue = "${project.build.sourceEncoding}" )
protected String encoding;

@Parameter
protected List<Resource> resources;


...

//Inside my plugin's execute() method: 
List<String> nonFilteredFileExtensions = new ArrayList<String>();
//resources is a parameter to my plugin, dir and filters are calculated within the plugin
MavenResourcesExecution mre = new MavenResourcesExecution(resources, dir, this.project, this.encoding, filters, nonFilteredFileExtensions, session);
mavenResourcesFiltering.filterResources(mre);

我通常以这种方式在插件配置中定义资源:

<resources>
    <resource>
        <directory>G:/MyPluginProject/src/test/resources/project-to-test/resources</directory>
        <excludes>
            <exclude>*.DAT</exclude>
        </excludes>
        <filtering>true</filtering>
    </resource>
</resources>

奇怪的是,对于<directory>,绝对路径工作正常,但我似乎无法使用${basedir}这样的表达式。我可能会忽视这里显而易见的事情......

答案 1 :(得分:1)

除了mojo-executor之外,没有直接的方法可以从插件代码调用另一个插件。

然而,插件可以执行并行生命周期,可以通过自己的XML配置调用其他插件。

http://books.sonatype.com/mvnref-book/reference/writing-plugins-sect-plugins-lifecycle.html