1

我想为一些源文件编写一个自定义资源过滤器,以便在前面添加一行

// @sourceURL=<path-to-file> 

在资源过滤期间,<path-to-file>文件相对于${project.basedir}.

我遵循了 Maven自定义资源过滤器文档,说我需要编写接口的自定义实现MavenResourcesFiltering

看了之后,org.apache.maven.shared.filtering.DefaultMavenResourcesFiltering我发现从头开始编写MavenResourcesFiltering实现并非易事。所以我一直在寻找从 扩展的方法DefaultMavenResourcesFiltering,并发现我需要为它提供一个自定义MavenFileFilter来执行实际的行前置。

现在我突然想到,除了复制 的整个源代码之外,没有办法做到这一点,DefaultMavenResourcesFiltering以便能够@Requirement为 a 重新定义其注释MavenFileFilter

@Requirement
private MavenFileFilter mavenFileFilter;

可能有一些方法可以通过配置Plexus DI 容器来实现我的目标,也许是通过Plexus 组件描述符。唉,这有点异国情调,也许有人知道类似问题的好例子?

4

1 回答 1

3

可能有一些方法可以通过配置 Plexus DI 容器来实现我的目标,也许是通过 Plexus 组件描述符

是的,有办法。您需要覆盖使用的"default" MavenFileFilter组件DefaultMavenResourcesFiltering,并提供您自己的。这很容易做到:只需为角色创建自己的 Plexus 组件MavenFileFilter并覆盖"default"提示,并将其添加为资源插件的依赖项。由于插件依赖项下直接存在的类首先加载,它们将覆盖默认的类。

设置如下。创建一个具有以下 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插件以component.xml自动生成 Plexus(以便我们的类正确注册为 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文件并在其中添加您想要的行。

安装此 Maven 项目后mvn clean install,您可以将其作为依赖项添加到资源插件中:

<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

于 2016-10-24T14:20:38.547 回答