我正在编写一个自定义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?或者其他一些方法来实现这个目标?
答案 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