Java 如何以编程方式调用maven资源插件

Java 如何以编程方式调用maven资源插件,java,maven,maven-plugin,Java,Maven,Maven Plugin,我正在编写一个自定义Maven插件,该插件的部分工作是过滤和复制一些资源 我编写的代码如下所示: CopyResourcesMojo rm = new CopyResourcesMojo(); rm.setOutputDirectory(outputDir); //determined dynamically in a loop rm.setOverwrite(true); rm.setFilters(filters); //determined dynamicall

我正在编写一个自定义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.
CopyResourcesMojo rm=new CopyResourcesMojo();
rm.setOutputDirectory(outputDir)//在循环中动态确定
rm.setOverwrite(true);
rm.setFilters(过滤器)//在循环中动态确定
rm.setResources(this.resources)//实际上是列表类型
rm.execute()//NulPointerException,因为rm的项目成员为null。
这会引发一个
NullPointerException
,因为
CopySourceMojo
无法访问我的mojo的
项目
,并且
CopySourceMojo
没有我可以使用的
setProject()
方法

我已经研究过如何使用mojo executor maven插件。我的问题是,使用这个库调用插件需要编写代码,以反映该插件的XML配置。我的插件将收到一个资源列表(就像
maven resources插件
一样),因此如果我要使用
mojo executor maven插件
,我想我必须编写代码来评估包含和排除。为此,我希望使用
maven资源插件
,这样的行为与其他以资源列表为参数的插件是100%一致的


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

除了mojo执行器之外,没有直接的方法从插件代码调用另一个插件

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


我最终找到了一种使用MavenResourcesFiltering和MavenResourcesExecution实现这一点的方法。文件如下:

我能够让这段代码实现我想要的:

/* 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);
/*类成员*/
@参数(defaultValue=“${project}”,必需=true,只读=true)
受保护的Maven项目;
@参数(defaultValue=“${session}”,必需=true,只读=true)
受保护的会话;
@组件(role=org.apache.maven.shared.filtering.MavenResourcesFiltering.class,hint=“default”)
受保护的MavenResourcesFiltering MavenResourcesFiltering;
@参数(property=“encoding”,defaultValue=“${project.build.sourceEncoding}”)
保护字符串编码;
@参数
受保护名单资源;
...
//在我的插件的execute()方法中:
列出非FilteredFileExtensions=new ArrayList();
//resources是我的插件的一个参数,dir和filters是在插件中计算的
MavenResourceExecution mre=新的MavenResourceExecution(资源、目录、this.project、this.encoding、筛选器、非FilteredFileExtensions、会话);
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>

G:/MyPluginProject/src/test/resources/project to test/resources
*.DAT
真的

奇怪的是,对于
,绝对路径可以正常工作,但我似乎无法让它与
${basedir}
这样的表达式一起工作。我可能忽略了一些显而易见的事情…

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