Maven Resources Plugin の Filtering 機能を使ってみる
Maven Resources Plugin は必要なタイミングで、リソースファイルを特定のディレクトリにコピーする機能です。Maven プロジェクトではコンパイルされたクラスは target/classes に配置され、実行時には target/classes に classpath を通せばよいように設計されています。(jar や war にパッケージされるのも targaet/classes 配下のファイルになります。)つまりコンパイルが走るタイミングで src/main/resources ディレクトリ下のリソースも classpath の通る target/classes に配置してやる必要があり、その役割を担うのが Maven Resources Plugin なのです。
Maven Resources Plugin には Filtering と呼ばれる機能があります。これにより、リソースファイルをコピーする際に、リソースファイル内の文字列を動的に書き換えた上でコピーすることができます。
Maven Resources Plugin の Filterig 機能を有効にする
Maven Resources Plugin の Filterig 機能を有効にするには、pom.xml の build > resource タグ内に、フィルタリングする対象のリソースファイルと、filtering = true を記述します。例えば、src/main/resources ディレクトリ内のファイルをフィルタリングしたい場合、pom.xml には以下のように記載します。<project> ... <build> ... <resources> <resource> <directory>src/main/resources</directory> <filtering>true</filtering> </resource> </resources> ... </build> ... </project>
フィルタリングする値を設定する
リソースファイル内の動的に書き換えたい文字列は、${変数名} という書式で記載しておきます。この ${変数名} がプレースホルダーとして機能し、フィルタリングによって指定した値に置換されることになります。例えば、src/main/resources/sample/application.properties 内の application.name 値を書き換える場合、以下のように記載します。
application.name=${appName}プレースホルダーとなる変数名には任意の名前を指定してください。
mvn 実行時に書き換える値を指定する
mvn コマンド実行時に動的に書き換える値を指定する場合、mvn コマンドの実行時引数として変数値を指定します。例えば、プレースホルダー appName を "PARADE 2006" に書き換えるには、以下のコマンドを実行します。$ mvn resources:resources -DappName="PARADE 2006"resources:resources ゴールは mvn のリソース配置を実行するオプションです。普通 mvn でのコンパイル前に実行されるゴールなので、mvn compile や mvn package でも実行されます。
フィルタリングする変数値を指定しなかった場合はそのプレースホルダーは無視され、プレースホルダーのまま各リソースがコピーされます。
実際にフィルタリングされたかを確認してみます。
$ cat src/main/resources/sample/application.properties application.name=${appName} $ cat target/classes/sample/application.properties application.name=PARADE 2006src/main/resources 下のもとのリソースはそのままプレースホルダーが記載されたままで、target/classes 下にコピーされたファイルはフィルタリングによって指定された値に書き換わっているのがわかります。
pom.xml 内で書き換える値を指定する
mvn コマンドに渡す実行時引数は、かわりに pom.xml 内のプロパティとしても指定することができます。pom.xml 内で指定したプロパティは、pom.xml 内で有効な変数として利用されることが一般的ですが、Maven Resources Plugin のフィルタリング機能でも、そのまま動的に書き換える値として引き継がれるのです。例えば、フィルタリング対象となる appName プロパティに "Tokyo dome" を指定する場合、以下のように pom.xml に指定します。
<project> ... <properties> <appName>Tokyo dome</appName> </properties> ... </project>あとは mvn コマンドを実行することで、フィルタリングを行うことができます。
$ mvn resources:resources $ cat target/classes/sample/application.properties application.name=Tokyo dome
Maven コメント (0) 2014/12/31 11:37:58