我想为某些源文件编写一个自定义资源过滤器,以便在一行之前添加
// @sourceURL=<path-to-file>
在资源过滤期间,其中是文件相对于
<path-to-file>
的路径。我遵循了Maven Custom resources filters文档,说我需要编写接口
${project.basedir}
的自定义实现。看了
MavenResourcesFiltering
之后,我发现从头开始编写org.apache.maven.shared.filtering.DefaultMavenResourcesFiltering
实现并不容易。因此,我在寻找从MavenResourcesFiltering
扩展的方法,发现我需要为其提供一个自定义的DefaultMavenResourcesFiltering
来执行实际的行首。现在我想到,除了复制
MavenFileFilter
的整个源代码以外,没有其他方法可以执行,以便能够为DefaultMavenResourcesFiltering
重新定义其@Requirement
注释:@Requirement
private MavenFileFilter mavenFileFilter;
可能有几种方法可以通过配置Plexus DI container来实现我的目标,也许可以通过Plexus Component Descriptor来实现。 las,这有点异国情调,也许有人知道类似问题的一个好例子吗?
最佳答案
可能有一些方法可以通过配置Plexus DI容器来实现我的目标,也许借助Plexus组件描述符
是的,有办法。您需要覆盖"default"
使用的MavenFileFilter
DefaultMavenResourcesFiltering
组件,并提供自己的组件。这很容易做到:只需为MavenFileFilter
角色创建自己的Plexus组件并覆盖"default"
提示,然后将其添加为资源插件的依赖项即可。由于这些类直接存在于插件的依赖项are loaded first下,因此它们将覆盖默认类。
设置如下。创建一个具有以下POM的新Maven项目:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>my.groupId</groupId>
<artifactId>my-file-filter</artifactId>
<version>0.0.1</version>
<dependencies>
<dependency>
<groupId>org.apache.maven.shared</groupId>
<artifactId>maven-filtering</artifactId>
<version>3.1.1</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.codehaus.plexus</groupId>
<artifactId>plexus-component-metadata</artifactId>
<version>1.6</version>
<executions>
<execution>
<goals>
<goal>generate-metadata</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
这依赖于Maven Filtering共享组件,并声明
plexus-component-metadata
插件以便自动生成Plexus component.xml
(以便我们的类正确注册为Plexus组件)。然后,自定义文件过滤器很简单:可以从默认的
DefaultMavenFileFilter
继承:@Component(role = MavenFileFilter.class, hint = "default")
public class MyMavenFileFilter extends DefaultMavenFileFilter {
public void copyFile(File from, File to, boolean filtering, List<FileUtils.FilterWrapper> filterWrappers, String encoding, boolean overwrite) throws MavenFilteringException {
super.copyFile(from, to, filtering, filterWrappers, encoding, overwrite);
// your logic of modifying the "to" file here
}
}
这将简单地覆盖所有其他方法最终都调用的
copyFile
方法,通过调用super方法,然后执行自定义代码,确保默认行为仍在发生。在这一部分中,您可以处理to
文件,并在其中预想行。使用
mvn clean install
安装此Maven项目后,您可以使用以下命令将其作为depenndecy添加到资源插件中:<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>3.0.1</version>
<dependencies>
<dependency>
<groupId>my.groupId</groupId>
<artifactId>my-file-filter</artifactId>
<version>0.0.1</version>
</dependency>
</dependencies>
</plugin>
这是您的自定义文件过滤器,该过滤器将被注入到
DefaultMavenResourcesFiltering
中。