2012-06-21 7 views
15

私はmaven-resource-pluginを使用して、私のプロジェクトのいくつかのリソースをフィルタリングします。私は私の親プロジェクトで:サブプロジェクトでMavenのさまざまなファイルタイプのエンコードを設定しますか?

<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 

私は、デフォルトのエンコーディング= ISO-8859-1でプレーンjava properties fileあるtest.propertiesファイルを持っています。このファイルには含まれています

aboutText=Version ${project.version} © 2012 blabla 

を正しく私はそのエンコーディングで別々の実行それぞれにMavenのリソース・プラグインを分割していることを確認、このファイルフィルタを作成するには:

<plugin> 
    <artifactId>maven-resources-plugin</artifactId> 
    <configuration> 
     <nonFilteredFileExtensions> 
     <nonFilteredFileExtension>ico</nonFilteredFileExtension> 
     <nonFilteredFileExtension>jar</nonFilteredFileExtension> 
     </nonFilteredFileExtensions> 
    </configuration> 
    <executions> 
     <execution> 
     <id>filter-properties-files</id> 
     <phase>generate-resources</phase> 
     <goals> 
      <goal>copy-resources</goal> 
     </goals> 
     <configuration> 
      <!-- java properties files are encoded in ISO-8859-1 so when 
      filtering those files we stick with that encoding. --> 
      <encoding>ISO-8859-1</encoding> 
      <outputDirectory>${basedir}/after</outputDirectory> 
      <resources> 
      <resource> 
       <filtering>true</filtering> 
       <directory>${basedir}/before</directory> 
       <includes> 
       <include>**/*.properties</include> 
       </includes> 
      </resource> 
      </resources> 
     </configuration> 
     </execution> 
     <execution> 
     <id>filter-non-properties-files</id> 
     <phase>generate-resources</phase> 
     <goals> 
      <goal>copy-resources</goal> 
     </goals> 
     <configuration> 
      <encoding>${project.build.sourceEncoding}</encoding> 
      <outputDirectory>${basedir}/after</outputDirectory> 
      <resources> 
      <resource> 
       <filtering>true</filtering> 
       <directory>${basedir}/before</directory> 
       <includes> 
       <include>**/*.product</include> 
       <include>**/*.inf</include> 
       </includes> 
      </resource> 
      </resources> 
     </configuration> 
     </execution> 
    </executions> 
    </plugin> 

これは行き過ぎと思われると私は感じています私はプラグインを正しく使用していないか、この問題を別の方法で処理する必要があることを示しています。たぶんプロパティファイルの特殊文字を直接エンコードすることに固執することがあります。

aboutText=Version ${project.version} \u00a9 2012 blabla 

+0

このために独自のmavenプラグインを作成することを検討しましたか? (antプラグインを使用するオプションがあるかもしれませんが、それはちょっと推測します) – wemu

+0

プロパティファイルの追加セクションを実行する必要がありますか? 私ははソースコード用だと思っていましたが、プロパティファイルはリソースなのでソースコードはありません。 – hennr

+0

'project.build.sourceEncoding'は実際に' maven-resources-plugin'に適用されます。https://maven.apache.org/plugins/maven-resources-plugin/xref/org/apache/maven/plugin/resources/を参照してください。 ResourcesMojo.html#69、 'encoding'のデフォルト値は' project.build.sourceEncoding'です –

答えて

2

実行を設定する必要があります...標準のディレクトリレイアウトに従っていても、使用していると思われる3つのファイルではなく、${basedir}/beforeのファイルを入れているようです${basedir}/afterに設定されているため、resources:resourcesのデフォルト実行とセクションに複数のresourcesを追加することは機能しません。

フィルタファイルのエンコーディングは、元pomモデル仕様での監督だったし、おそらくMavenの

4

の一部としてまだ指定されていないバージョンで修正される問題は、複雑な手順として明らかに、それ自体が貴重な答えです著者が提供するのは、さまざまなフィルタリングされたファイルタイプに対して異なるエンコーディングを設定する唯一の方法です。与えられた例では、しかし、著者の非標準的なユースケースに固有のものであり、例の実際の使用には落とし穴をはらんであるなしに、いくつかの重要な詳細の上にグロス:

  • それは明白ではありません、作者の例ではのデフォルトリソースコピー目標resourcesはまだ有効ですと定義された2つの目標に加えて実行されます!
  • 作成者がデフォルトprocess-resourcesの代わりにライフサイクルフェーズgenerate-resourcesを使用したことがわかります。これは、上記の最初のポイントを回避するためのトリックです。 2つのcopy-resourcesゴールを以前のライフサイクルフェーズで発生させることによって、リソースは所定のルールに従ってコピーされ、default-resourcesゴールが元のリソースに沿ってコピーされると、明らかにそのoverwriteの設定がデフォルトのfalseになるので、しかし、disable altogetherdefault-resources実行する方が良いでしょう。
  • 著者はoutputDirectory宣言を提供しています。カスタム出力ディレクトリが必要だったので、作者がこれを提供しただけだと思う​​のは当然です。結局のところ、resourcesゴールはこの設定のデフォルト値を提供します。しかし、奇妙なことに、copy-resourcesゴールについては、実際にこの設定が必要です。しかし、標準のMaven変数${project.build.outputDirectory}が値として使用できます。

質問の著者自身の例をもとに、ISO-8859-1を使用してプロパティファイルをフィルタリングし、フィルタリングせずに他のファイルをコピーし、デフォルトのリソースコピーが発生しないようにするカットアンドペースト方法です;すべて標準のソースディレクトリとターゲットディレクトリを使用しています:

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-resources-plugin</artifactId> 
    <version>2.7</version> 
    <executions> 
    <execution> 
     <!-- Turn off default resource copying --> 
     <id>default-resources</id> 
     <phase /> 
    </execution> 
    <execution> 
     <!-- Filter resources in properties files. --> 
     <id>filter-properties-files</id> 
     <phase>process-resources</phase> 
     <goals> 
     <goal>copy-resources</goal> 
     </goals> 
     <configuration> 
     <encoding>ISO-8859-1</encoding> 
     <outputDirectory>${project.build.outputDirectory}</outputDirectory> 
     <resources> 
      <resource> 
      <directory>src/main/resources</directory> 
      <filtering>true</filtering> 
      <includes> 
       <include>**/*.properties</include> 
      </includes> 
      </resource> 
     </resources> 
     </configuration> 
    </execution> 
    <execution> 
     <!-- Do not do property substitution in files that are not properties files, such as binary files. --> 
     <id>copy-other-resources</id> 
     <phase>process-resources</phase> 
     <goals> 
     <goal>copy-resources</goal> 
     </goals> 
     <configuration> 
     <outputDirectory>${project.build.outputDirectory}</outputDirectory> 
     <resources> 
      <resource> 
      <directory>src/main/resources</directory> 
      <filtering>false</filtering> 
      <excludes> 
       <exclude>**/*.properties</exclude> 
      </excludes> 
      </resource> 
     </resources> 
     </configuration> 
    </execution> 
    </executions> 
</plugin> 
+0

このフィードバックに感謝します!質問:これはbuild.resources respの下で定義されたリソースとフィルタリングオプションとどのように連携しますか? build.testResources?両方またはプラグインの設定だけを設定する必要はありますか? – Puce

関連する問題