Mavenには、フィルタリング(Filtering)という概念があります。
簡単に言えば、ビルド時に動的なテキスト置換を行うことです。
例えば、リソースファイルに
# application.properties
application.name=${pom.name}
application.version=${pom.version}
のような形式の記述があった場合にそれを
# application.properties application.name=Maven Quick Start Archetype application.version=1.0-SNAPSHOT
に置き換えてビルドを行います。
もちろん、通常のファイルでフィルタリングをしては困るので
デフォルトではこのフィルタ機能はOFFになっています。
フィルタ機能を有効にするには、pom.xml の resource 要素の中で定義します。
<project>
...
<build>
...
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
</build>
</project>
上の例では、src/main/resources 以下にあるファイルで
フィルタリングが有効になります。
リソース内でのフィルタリング記述法は一貫して
${property_name}
となります。property_name には、いくつかのプロパティ名が使えます。
例えば、pom.xml 内に以下のような記述があった場合。
<project>
<version>1.0-SNAPSHOT</version>
<build>
<finalName>myapp-snapshot.txt<finalName>
</build>
</project>
${pom.version} は Maven Quick Start Archetype に、
${pom.build.finalName} は myapp-snapshot.txt に置換されます。
任意のプロパティを外部ファイル内で定義する方法です。
<project>
<build>
<filters>
<filter>src/main/filters/filter.properties</filter>
</filters>
</build>
</project>
このように、filters要素で外部プロパティファイルを定義します。
filter.properties の内容が以下のようになっているとします。
# filter.properties my.filter.value=hello!
${my.filter.value} は hello! に置換されます。
任意のプロパティをpom.xml内で定義する方法です。
<project>
<properties>
<my.filter.value>hello</my.filter.value>
</properties>
</project>
置換結果は上と同じになります。
任意の環境変数も使うことが出来ます。
この場合、環境変数はMaven実行時にコマンドラインから渡すことになります。
% mvn process-resources "-Dmy.filter.value=hello"