16

maven-resource-pluginを使用して、maven プロジェクトの一部のリソースをフィルタリングします。親プロジェクトには次のものがあります。

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

サブプロジェクトには、デフォルトのエンコーディング = ISO-8859-1のプレーンなJava プロパティ ファイルであるtest.propertiesファイルがあります。このファイルには以下が含まれます。

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

このファイルが正しくフィルタリングされるようにするために、maven-resource-plugin をそれぞれのエンコーディングで個別の実行に分割しました。

  <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

?

4

2 に答える 2

5

著者が提供する複雑な手順は、さまざまなフィルタリングされたファイルタイプに対して異なるエンコーディングを構成する唯一の方法であるため、質問はそれ自体が非常に貴重な回答です。ただし、与えられた例は、著者の非標準のユースケースに固有のものであり、いくつかの重要な詳細を省略しています。これがないと、例を実際に使用すると問題が発生します。

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

質問の著者自身の例に基づいて、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>

更新:さらに調査した結果、デフォルトの実行を無効にする代わりに、プロパティ ファイルを無視するようにデフォルトの実行を変更し、追加の実行としてプロパティ ファイルのフィルタリングを追加することができると考えています。さらに、 のresources代わりにゴールが使用された場合、 は自動的にフェーズにバインドされ、copy-resourcesに出力されるため、出力ディレクトリまたはフェーズを示す必要はありません。プラグインをバージョン 3.1.0 に更新したので、上記で使用したバージョンではこれらのオプションの一部が利用できなかったことに注意してください。この新しい短い構成はまだテストしていません。resources:resourcesprocess-resources${project.build.outputDirectory}

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-resources-plugin</artifactId>
  <version>3.1.0</version>
  <executions>
    <execution>
      <!-- Ignore properties files by default. -->
      <id>default-resources</id>
      <configuration>
        <resources>
          <resource>
            <directory>${project.basedir}/src/main/resources</directory>
            <excludes>
              <exclude>**/*.properties</exclude>
            </excludes>
          </resource>
        </resources>
      </configuration>
    </execution>
    <execution>
      <!-- Filter resources in properties files using ISO-8859-1. -->
      <id>filter-properties-files</id>
      <goals>
        <goal>resources</goal>
      </goals>
      <configuration>
        <encoding>ISO-8859-1</encoding>
        <resources>
          <resource>
            <directory>${project.basedir}/src/main/resources</directory>
            <filtering>true</filtering>
            <includes>
              <include>**/*.properties</include>
            </includes>
          </resource>
        </resources>
      </configuration>
    </execution>
  </executions>
</plugin>

誰かがこの新しい構成をテストして、上記の元の構成と同じように機能するかどうかを教えてくれるかもしれません。

于 2014-10-06T23:34:13.033 に答える
2

実行を構成する必要があるのは正しいです...標準のディレクトリレイアウトに従っている場合は、3つではなく、2つの実行で済ませることができますが、ファイルをに入れているよう${basedir}/beforeです${basedir}/after。セクションに複数をresources:resources追加することと相まって、あなたのために機能しません。resourcesbuild

フィルタリングされたファイルのエンコーディングは、元のpomモデル仕様では見落としであり、まだ指定されていないバージョンのMavenで修正される可能性があります。

于 2012-09-17T11:43:25.237 に答える