maven-replacer-pluginの使用

9614 ワード

プラグインのホームページ:https://code.google.com/p/maven-replacer-plugin/
プラグインの説明:
maven-replacer-plugin:replacer is a build plugin to replace tokens within a file with a given value and fully supports regular expressions.

プラグインの構成と使用例:https://code.google.com/p/maven-replacer-plugin/wiki/UsageGuide
 
この文章を書くときの最新バージョンは:1.5.3です.
				<groupId>com.google.code.maven-replacer-plugin</groupId>
				<artifactId>replacer</artifactId>
				<version>1.5.3</version>
はpom.xmlにこのプラグインを追加するには、次の手順に従います.
 <build>
  <plugins>
   ...
   <plugin>
    <groupId>com.google.code.maven-replacer-plugin</groupId>
    <artifactId>replacer</artifactId>
    <version>1.5.3</version>
       <executions>
        ...
       </executions>
       <configuration>
        ...
       </configuration>
   </plugin>
  </plugins>
 </build>

次にexecutionsとconfigurationの構成を追加します.
 
まずexecutionsを見てみましょう.executionsで最も重要なのはphaseとgoalの構成です.
phaseは任意のphaseであり、典型的にはcompile、test、package、prepare-resourcesなどがある.goalはreplacerプラグインに固定値replaceが1つしかありません.
   
executionsを追加すると、プラグイン定義は次のように見えます.
 <build>
  <plugins>
   <plugin>
    <groupId>com.google.code.maven-replacer-plugin</groupId>
    <artifactId>replacer</artifactId>
    <version>1.5.3</version>
    <executions>
     <execution>
      <phase>prepare-package</phase>
      <goals>
       <goal>replace</goal>
      </goals>
     </execution>
    </executions>
    <configuration>
      ...
    </configuration>
   </plugin>
  </plugins>
 </build>

 
次にconfigurationセクションを定義します.
異なる意図に基づいて、configurationセクションでは異なる定義が必要です.次に、例を示します.
 

単一ファイル入出力、単一置換


例えばa.txtというファイルがあります.そこにはThis book names{book.name}という内容があります.
{book.name}を実際のコンテンツに置き換えるには、configurationの構成は次のとおりです.
				<configuration>
					<file>src/test/resources/a.txt</file>
					<outputFile>src/main/resources/a.txt</outputFile>
					<regex>false</regex>
					<token>{book.name}</token>
					<value>Thinkin in Java</value>
				</configuration>

パラメータの説明は次のとおりです.
  • file:指定入力ファイル
  • outputFile:指定出力ファイル
  • regex:tokenが正規表現であるかどうかを指定し、デフォルト値はtrue(ただし、regex構成を指定しなければ結果がないのはおかしいので、明示的にregexを指定する必要があることに気づいた)
  • token:置換する値
  • value:置換後の値
  • 単一ファイル入出力、複数置換


    複数の置換を使用するには、2つの方法があります.
     

    replacements


    a.txtの内容は、This book names{book.name}and author is{author.name}に変更するなど、replacementsにすべての置換ペアをリストできます.
    次にconfigurationを次のように変更します.
    				<configuration>
    					<file>src/test/resources/a.txt</file>
    					<outputFile>src/main/resources/a.txt</outputFile>
    					<regex>false</regex>
    					<replacements>
    						<replacement>
    							<token>{author.name}</token>
    							<value>Bruce Eckel </value>
    						</replacement>
    						<replacement>
    							<token>{book.name}</token>
    							<value>Thinkin in Java </value>
    						</replacement>
    					</replacements>
    				</configuration>

    ここでは、単純なtoken/valueペアを複数のreplacementで置き換え、各replacementにはtoken/valueペアが含まれます.
     
     

    tokenValueMap


    また、tokenValueMapファイルを使用して、propertiesファイルのようなすべての置換ペアを指定することもできます.たとえば、上記の例では、次のように変更できます.
    				<configuration>
    					<file>src/test/resources/a.txt</file>
    					<outputFile>src/main/resources/a.txt</outputFile>
    					<regex>false</regex>
    					<tokenValueMap>src/test/resources/book.conf</tokenValueMap>
    				</configuration>

    その中でbook.confファイルの内容は以下の通りです.
    {book.name}=Thinkin in Java
    {author.name}=Bruce Eckel 

    比較:相対的にtokenValueMapの方式はもっと簡潔で、柔軟です;しかし、この方法ではシステム属性を使用できないことに気づきました.たとえば、値を現在のプロジェクトのバージョン${project.version}に置き換えるには、token/valueペアしか使用できません.
     

    複数ファイル入出力、複数置換


    includesを使用して、複数の入力ファイルを指定できます.
    				<configuration>
    					<basedir>${basedir}/src/test/resources</basedir>
    					<includes>
    						<include>a.txt</include>
    						<include>b.txt</include>
    					</includes>
    					<outputBasedir>${basedir}/src/main/resources</outputBasedir>
    					<outputDir>.</outputDir>
    					<regex>false</regex>
    					<tokenValueMap>src/test/resources/book.conf</tokenValueMap>
    				</configuration>
  • basedir:入力ファイルリストのルートディレクトリを指定する
  • include:置換するファイルを指定します.(最終ファイルのパスはbasedir+include)
  • outputBasedir:出力ファイルのルートディレクトリを指定する
  • outputDir:出力ファイルディレクトリを指定します.(最終ファイルのパスはoutputBasedir+outputDir+include)
  • includesには複数のincludeが定義され、各includeは置換するファイルを指定します.outputDirは出力ディレクトリを指定します.複数のファイルがあるため、出力ファイルを指定できません(上書きしないと).
     
    注意:basedirとoutputBasedirは、includeとoutputDirで絶対パスを指定しても指定する必要があります.
     

    出力ディレクトリ制御


    上記の例では、a.txtおよびb.txtは、src/test/resourcesの下に直接配置され、変換後に生成されたa.txtおよびb.txtも入力ディレクトリsrc/main/resourcesの下に直接配置される.入力ファイルのディレクトリ構造を変更するには、次の手順に従います.
    src/test/resources
                               \_ aaa/a.txt
                               \_ bbb/b.txt
    設定は次のように変更する必要があります.
    				<configuration>
    					<basedir>${basedir}/src/test/resources</basedir>
    					<includes>
    						<include>aaa/a.txt</include>
    						<include>bbb/b.txt</include>
    					</includes>
    					<outputBasedir>${basedir}/src/main/resources</outputBasedir>
    					<outputDir>.</outputDir>
    					<regex>false</regex>
    					<tokenValueMap>src/test/resources/book.conf</tokenValueMap>
    				</configuration>

    出力ディレクトリ構造は次のとおりです.
    src/main/resources
                                 \_ aaa/a.txt
                                 \_ bbb/b.txt
    入力ディレクトリ構造が出力ディレクトリ構造に全体的にコピーされていることがわかります.
    ここでpreserveDirパラメータは出力動作を制御し、デフォルト値はtrueであり、入力ディレクトリ構造が出力ディレクトリ構造にコピーされます.falseに変更すると、入力ファイルは出力ディレクトリの下に直接配置され、ディレクトリ構造は無視されます.たとえば、次のようになります.
    				<configuration>
    					<basedir>${basedir}/src/test/resources</basedir>
    					<includes>
    						<include>aaa/a.txt</include>
    						<include>bbb/b.txt</include>
    					</includes>
    					<outputBasedir>${basedir}/src/main/resources</outputBasedir>
    					<outputDir>.</outputDir>
    					<regex>false</regex>
    					<preserveDir>false</preserveDir>
    					<tokenValueMap>src/test/resources/book.conf</tokenValueMap>
    				</configuration>

    出力ディレクトリ構造は次のとおりです.
    src/main/resources
                                 \_ a.txt
                                 \_ b.txt
     

    パターンマッチング


    上にはincludesですべての入力ファイルを指定します.ファイル量が少ない場合、ファイル名とパスが固定されている場合、この方式は問題を解決しやすいが、ファイル量が大きく、ファイル名とディレクトリ構造が可変であれば、この方式は柔軟ではない.replacerプラグインはモードマッチングをサポートします.例:
    				<configuration>
    					<basedir>${basedir}/src/test/resources</basedir>
    					<includes>
    						<include>**/*.txt</include>
    					</includes>
    					<outputBasedir>${basedir}/src/main/resources</outputBasedir>
    					<outputDir>.</outputDir>
    					<regex>false</regex>
    					<preserveDir>false</preserveDir>
    					<tokenValueMap>src/test/resources/book.conf</tokenValueMap>
    				</configuration>

    ここでincludeは**/*と定義する.txtは、入力ファイルのルートディレクトリの下のすべてのディレクトリの下のすべてを表す.txtの最後のファイルは一致します. 
     

    ファイルの除外


    上記のモードマッチングでは、マッチングルールに合致するすべてのファイルが処理されますが、処理されたくないファイルもあります.ここでexcludeでフィルタリングする必要があるすべてのファイルを定義できます.たとえば、すべてのファイル名a.txtのファイルをフィルタします.
    				<configuration>
    					<basedir>${basedir}/src/test/resources</basedir>
    					<includes>
    						<include>**/*.txt</include>
    					</includes>
    					<excludes>
    						<exclude>**/a.txt</exclude>
    					</excludes>
    					<outputBasedir>${basedir}/src/main/resources</outputBasedir>
    					<outputDir>.</outputDir>
    					<regex>false</regex>
    					<preserveDir>false</preserveDir>
    					<tokenValueMap>src/test/resources/book.conf</tokenValueMap>
    				</configuration>