【问题标题】:How to call maven-resources-plugin programmatically如何以编程方式调用 maven-resources-plugin
【发布时间】:2014-04-15 18:06:13
【问题描述】:

我正在编写一个自定义 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?或者其他方式来实现这一点?

【问题讨论】:

  • 问题是你到底想用你的插件实现什么?您真的确定需要编写一个特殊的插件来满足您的需求吗?你能解释一下它们可能是其他插件已经完成了你需要的所有东西吗?
  • @khmarbaise:基于插件配置中的值列表,插件创建一系列自定义过滤器文件,并选择性地过滤具有特定文件的某些资源。它实际上可以在没有任何特殊插件的情况下完成,但是这样做的配置有点吓人,我担心它会成为维护的噩梦。在 Java 中实现相同的目标(创建过滤器)比在 pom 文件中要容易得多。现在我希望能够从插件中运行复制/过滤过程,并在特定资源上使用特定过滤器。
  • @khmarbaise:这是我们构建过程的一部分,我还没有看到任何类似的插件。

标签: java maven maven-plugin


【解决方案1】:

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

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

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

【讨论】:

  • 有趣。我想我可以让我的主插件为它要调用的插件创建/修改配置?
【解决方案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>

奇怪的是,对于&lt;directory&gt;,绝对路径可以正常工作,但我似乎无法让它与${basedir} 之类的表达式一起工作。我可能在这里忽略了一些明显的东西......

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-20
    • 2012-07-19
    • 1970-01-01
    • 2014-12-04
    • 2011-10-12
    相关资源
    最近更新 更多