自定义 MavenResourcesFiltering 难以实现?
Custom MavenResourcesFiltering hard to implement?
我想为一些源文件编写一个自定义资源过滤器,以便在前面加上一行
// @sourceURL=<path-to-file>
在资源过滤时,其中<path-to-file>
是文件相对于${project.basedir}
的路径。
我按照 Maven Custom resources filters 文档,说我需要编写接口的自定义实现 MavenResourcesFiltering
。
看过 org.apache.maven.shared.filtering.DefaultMavenResourcesFiltering
之后,我认为从头开始编写 MavenResourcesFiltering
实现并非易事。所以我一直在寻找从 DefaultMavenResourcesFiltering
扩展的方法,发现我需要为它提供一个自定义 MavenFileFilter
来实际添加行。
现在我想到没有办法做到这一点,除了复制 DefaultMavenResourcesFiltering
的整个源代码,以便能够为 [=] 重新定义其 @Requirement
注释18=]:
@Requirement
private MavenFileFilter mavenFileFilter;
可能有一些方法可以通过 Plexus DI container, perhaps by means of a Plexus Component Descriptor 的配置来实现我的目标。唉,这有点奇怪,也许有人知道类似问题的一个很好的例子?
Probably there are ways to achieve my goals by configuration of the Plexus DI container, perhaps by means of a Plexus Component Descriptor
是的,有办法。您需要覆盖 DefaultMavenResourcesFiltering
使用的 "default"
MavenFileFilter
组件,并提供您自己的组件。这很容易完成:只需为 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
方法,通过调用超级方法确保默认行为仍然发生,然后执行您的自定义代码。在这部分,您可以处理 to
文件并在其中添加您想要的行。
使用 mvn clean install
安装此 Maven 项目后,您可以将其作为依赖项添加到资源插件中:
<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
。
我想为一些源文件编写一个自定义资源过滤器,以便在前面加上一行
// @sourceURL=<path-to-file>
在资源过滤时,其中<path-to-file>
是文件相对于${project.basedir}
的路径。
我按照 Maven Custom resources filters 文档,说我需要编写接口的自定义实现 MavenResourcesFiltering
。
看过 org.apache.maven.shared.filtering.DefaultMavenResourcesFiltering
之后,我认为从头开始编写 MavenResourcesFiltering
实现并非易事。所以我一直在寻找从 DefaultMavenResourcesFiltering
扩展的方法,发现我需要为它提供一个自定义 MavenFileFilter
来实际添加行。
现在我想到没有办法做到这一点,除了复制 DefaultMavenResourcesFiltering
的整个源代码,以便能够为 [=] 重新定义其 @Requirement
注释18=]:
@Requirement
private MavenFileFilter mavenFileFilter;
可能有一些方法可以通过 Plexus DI container, perhaps by means of a Plexus Component Descriptor 的配置来实现我的目标。唉,这有点奇怪,也许有人知道类似问题的一个很好的例子?
Probably there are ways to achieve my goals by configuration of the Plexus DI container, perhaps by means of a Plexus Component Descriptor
是的,有办法。您需要覆盖 DefaultMavenResourcesFiltering
使用的 "default"
MavenFileFilter
组件,并提供您自己的组件。这很容易完成:只需为 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
方法,通过调用超级方法确保默认行为仍然发生,然后执行您的自定义代码。在这部分,您可以处理 to
文件并在其中添加您想要的行。
使用 mvn clean install
安装此 Maven 项目后,您可以将其作为依赖项添加到资源插件中:
<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
。