pom.xml
内で${...}
と記述することで変数置換ができることと同様に、maven-resources-pluginのフィルタリングを利用することで設定ファイル(e.g., system.properties
)内でも変数置換が行える。
よくありそうなユースケース
-
pom.xml
内のproject.version
をプロパティファイル経由でプログラムが利用する - 設定ファイルの各種パスで
project.basedir
を利用してテスト実行などではプロジェクト内で入出力を完結させる - etc...
そもそもmaven-resources-pluginって何ですか?
ソース以外の設定ファイルリソースなどをコピーするためのプラグイン。
http://maven.apache.org/plugins/maven-resources-plugin/
基本的な挙動
このプラグインが利用する項目の一部を抜粋。
<build>
<outputDirectory>${project.build.directory}/classes</outputDirectory>
<testOutputDirectory>${project.build.directory}/test-classes</testOutputDirectory>
<resources>
<resource>
<directory>${project.basedir}/src/main/resources</directory>
</resource>
</resources>
<testResources>
<testResource>
<directory>${project.basedir}/src/test/resources</directory>
</testResource>
</testResources>
</build>
-
resources:resources
ゴールでresources
で指定しているディレクトリ以下リソースをoutputDirectory
へコピーする -
resources:testResources
ゴールでtestResources
で指定しているディレクトリ以下リソースをtestOutputDirectory
へコピーする
単純に言えばコピーしているだけですね。
特定ファイルのみコピー/除外
例えば拡張子が.txt
と.rtf
のみコピーする場合はincludes
でパターンを指定。
<resources>
<resource>
<directory>src/my-resources</directory>
<includes>
<include>**/*.txt</include>
<include>**/*.rtf</include>
</includes>
</resource>
</resources>
逆に除外する場合はexcludes
でパターンを指定する。
<resources>
<resource>
<directory>src/my-resources</directory>
<excludes>
<exclude>**/*.bmp</exclude>
<exclude>**/*.jpg</exclude>
<exclude>**/*.jpeg</exclude>
<exclude>**/*.gif</exclude>
</excludes>
</resource>
</resources>
本題:フィルタリング
フィルタリングのExamplesはこれ。
http://maven.apache.org/plugins/maven-resources-plugin/examples/filter.html
filtering
にtrue
を設定するとコピー時にフィルタリングが有効になる。
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
system.properties
にこう書き、
version=${project.version}
pom.xml
内で<version>1</version>
となっているならば、
version=1
のように変換されて出力される。使える変数はpom.xml
内と同様(のはず、明示的な言及は未確認...)。
${project.basedir}
などももちろん利用できる。例えばログ出力パスが設定にあり、ローカル実行時は出力をoutputDirectory
以下としたければ、
log4j.appender.C.File=${project.build.outputDirectory}/temp/a.log
などと書いておけばいいんじゃないでしょうか。
まとめ
- maven-resources-pluginのフィルタリングを利用して設定ファイルなどもDRYに書きましょう