開発フェーズは終わり、細かい残作業の片づけと、結合試験の準備が始まりました。
で、前々から頭の中で「どうするのが楽なんだろう…」と思っていた
環境ごとにwarに含む設定ファイルをどうやって切り替え、管理するかなぁ…
という疑問に着手しました。もっと早い段階から考えてやっとけよ!と自分で突っ込みつつ…恒例の「時間がなかったんです」という言い訳(^^;
色々方法がありそうですが、今回は以下のサイト群を参考にmaven-war-pluginとprofileを使うことにしました。
今のところ環境は少ない
設定ファイルを分ける前提となる環境は
と主に3環境で、当然ながら近い将来
となっていく感じです。
.NETでは外部設定値のほとんどをweb.config等で一元管理する形が多く、しかもwarに固めるようなことがないため、単純にconfigファイルを管理して、必要に応じて環境に上書く…などしていたような。。。ぶっちゃけこの辺りもビルド職人がやっている環境だったので何とも…。
今回はJenkins導入でビルド職人はPC内の執事さんになったので、ここも自動化せねば意味がないっ。
外部の設定ファイル
NetBeansのファイルタブでツリー構造見ると以下のように色々設定ファイルがあります(^^;いつの間にか膨らんで…
このうち、具体的にどんな外部設定ファイルを環境ごとに分けたいかというと
- logback.xml…ログレベル変わるので
- beans.xml…インターセプタを利用しており、環境によってクラスを使い分けるため
- persistence.xml…環境によってunit変えたり、JPAのログレベル変えたり
- web.xml…javax.faces.PROJECT_STAGEとかその他色々
- classes配下に置いたpropertiesファイル達…諸事情により幾つかあるので
辺りです。なんか他に標準的な方法(各ファイルで上手く設定できるとか…)がありそうな気もするので、普通そういうファイルは分けないよ、みたいな間違ってる部分あったらコメント頂けると嬉しいです…(-_-;Java EEやって半年以上となったけど、未だこの辺の「いろは」がわかってない感じです。
で、mavenのprofileとかって最初から設定しないと色々大変なんじゃ…と不安を感じていたのですが、今までに使っていたpom.xmlはあまり変わることなく、設定の記述を追加するだけでいけました。
Profileの設定
以下はサンプルで作ったものですが、実際に書いたものも似たようなものです。
pom.xmlに以下のようなprofilesタグを追加しました。
<profiles>
<profile>
<id>sandbox</id>
<properties>
<webxmlpath>src/sandbox/webapp/WEB-INF/web_dev.xml</webxmlpath>
<settingspath>src/sandbox/webapp/WEB-INF/classes</settingspath>
<beanspath>src/sandbox/webapp/WEB-INF</beanspath>
<persistencepath>src/sandbox/resources/META-INF</persistencepath>
</properties>
</profile>
- テスト本番マシン用 --
… 以下、省略 …
</profiles>
で、これに合わせてフォルダも以下のように
srcの配下にsandboxやproductionなどを追加して、必要なフォルダとファイルだけを配置しました。
maven-war-pluginの設定
maven-war-pluginはconfigurationタグを追加して、上記Profileのpropertiesタグで追加したプロパティ設定しました。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.1.1</version>
<configuration>
<webXml>${webxml.path}</webXml>
<webResources>
<resource>
<directory>${settings.path}</directory>
<targetPath>WEB-INF/classes</targetPath>
</resource>
<resource>
<directory>${beans.path}</directory>
<targetPath>WEB-INF</targetPath>
<filtering>true</filtering>
<includes>
<include>beans.xml</include>
</includes>
</resource>
<resource>
<directory>${persistence.path}</directory>
<targetPath>WEB-INF/classes/META-INF</targetPath>
<filtering>true</filtering>
<includes>
<include>persistence.xml</include>
</includes>
</resource>
</webResources>
</configuration>
</plugin>
これだけです。
Profile設定を追加するとNetBeansでプロジェクトを右クリックして「構成を設定」を開くと、追加したProfile各々がみえて、選択してビルドすれば、上記設定に基づいたwarが生成されます。
さすがNetBeans!Good Job!
これで、環境ごとに手で設定ファイルを上書きするとかしないで済むー、はず。