2016-10-24 10 views
1

私は<path-to-file>${project.basedir}からのファイルの相対パスであるリソースフィルタリング、中にラインカスタムMavenResourcesFilteringを実装するのは難しいですか?

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

を付加するためには、いくつかのソースファイル用のカスタムリソースフィルタを書きたいと思います。

私はインターフェイスMavenResourcesFilteringのカスタム実装を書く必要があると言って、Maven Custom resources filtersのドキュメントに従っていました。

MavenResourcesFilteringの実装をゼロから作成することは簡単ではないと思った。org.apache.maven.shared.filtering.DefaultMavenResourcesFilteringを見てから、そこで、私はDefaultMavenResourcesFilteringから拡張する方法を探していましたが、実際に行を追加するカスタムMavenFileFilterを提供する必要があることがわかりました。

今ではMavenFileFilterために、その@Requirement注釈を再定義することができるようにするために、DefaultMavenResourcesFilteringの全ソースコードをコピーする以外に、これを実行する方法がないことを私に発生します。

@Requirement 
private MavenFileFilter mavenFileFilter; 

おそらくそこおそらくPlexus Component DescriptorによってPlexus DI containerの構成によって私の目標を達成する方法です。ああ、それは少しエキゾチックです、誰かが同じような問題の良い例を知っていますか?

答えて

1

は、おそらく神経叢DIコンテナの設定によって、私の目標を達成するための方法は、おそらく神経叢コンポーネント記述子の手段

によってはい、方法がある、があります。 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共有コンポーネントに依存している、と私たちのクラスが正しく叢として登録されているように(自動的に神経叢component.xmlを生成するために、plexus-component-metadataプラグインを宣言するコンポーネント)。

その後、カスタムファイルフィルタは単純です:DefaultMavenFileFilterあるデフォルト1、継承することが可能である:

@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ファイルを処理し、それに必要な行をプリペアすることができます。このMavenプロジェクトがmvn clean installと一緒にインストールされると

、あなたがリソースプラグインに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内部に注入されるカスタムファイルフィルタです。

+0

Thx、参考までにhttps://github.com/aperto/sourceurl-resourcefilterを参照してください。私はあなたのソリューションを見た前に終了していたので、 'DefaultMavenFileFilter'のコードをコピー&ペーストするのではなく、ターゲットファイルに2回書くだけで、もっと単純化できます。' mavenFilteringHint'を使わずに提案する。 – jfrantzius

関連する問題