ビルド手順などを変更できるようにするためのしくみ「プロファイル」がある。
プロファイルが有効化する条件は色々あるが、大体以下の通り。
・コマンドライン引数
・settings.xml の activeProfiles 要素
・デフォルト
・JDK のバージョン
・OS の種類
・システムプロパティ
・ファイルの有無
そして、手法も調べた感じ2通りある。
・同じリソースに対して、開発時と本番時でそれぞれの値を設定する。
・開発時と本番時でリソース自体を切り替える。
前者のは、環境による設定ファイルの差異が限定的な場合に有効
例えば、log4j でのログの出力レベルを、本番環境では警告レベル以上、開発時は全てをログに出力する場合。
<!-- 開発環境用プロファイル -->
<profile>
<id>development</id>
<properties>
<log.level>ALL</log.level>
</properties>
</profile>
<!-- 本番環境用プロファイル -->
<profile>
<id>production</id>
<properties>
<log.level>WARN</log.level>
</properties>
</profile>
log4j.propertiesでは、
log4j.rootLogger=${log.level}, ...
このように、設定ファイルの一部だけを変更すれば良い場合は、フィルタ機能を利用するアプローチが簡単。
後者の設定ファイルの一部を変更するだけでは対応しきれない場合や、
環境依存の設定をプロパティで置き換えるには数が多すぎる場合に有効。
または、開発時にはMaven2でビルドしない場合など。
具体的には、
src/main/resources ... 開発環境用の設定ファイル
src/release/resources ... 本番環境用の設定ファイル
という構成にして、
<profiles>
<profile>
<id>release</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<maven.test.skip>true</maven.test.skip>
</properties>
<build>
<resources>
<resource>
<directory>src/release/resources</directory>
</resource>
<resource>
<directory>src/main/resources</directory>
</resource>
</resources>
</build>
</profile>
</profiles>
のようにして、実行するとsrc/main/resourcesのファイルが、src/release/resourcesに置き換わる。
自分の場合はこの方法で本番リリース用のWarを作成しようとしていたのだが、一部うまくいかない。
何がうまくいってないのかというと、常にsrc/release/resourcesの内容で上書きして欲しいのに、
それぞれのタイムスタンプが新しいファイルが有効になってしまう。これに嵌った。
結局は、<filtering>false</filtering>を追加すれば意図する通りになった。
<resource>
<filtering>true</filtering>
<directory>src/release/resources</directory>
</resource>
<resource>
<filtering>false</filtering>
<directory>src/main/resources</directory>
</resource>
Maven2は便利なんだけど、まだ慣れてないせいか苦手。Antのがまだ好きだなぁ。
# 結局、別の問題があってAntでwar作ってます。。。
# Maven2 Additionalがあるから、必要なjarは既にlib内にあるし、Antで十分事足りた。
# リソースファイルの上書きも簡単にできたし。でも、Maven2にも早く慣れないとなぁ。