LoginSignup
23
24

More than 5 years have passed since last update.

maven-resources-pluginのフィルタリングを使って設定ファイル内で変数置換

Posted at

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

filteringtrueを設定するとコピー時にフィルタリングが有効になる。

<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に書きましょう
23
24
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
23
24