ITエンジニアの成長ブログ

ITエンジニアとして行う勉強の発信&日々の生活で体験した楽しいことをゆるく発信

環境依存ファイルをApache Antで管理する方法

今回は、環境依存ファイルをApache Antでどのように管理すればよいかについて、自分の経験した方法を備忘録として残しておくためにこのブログ記事を書きました。

ここで言う環境依存ファイルとは、ローカル環境や結合環境、ステージング環境、本番環境などの環境毎に異なる設定値を持つ設定ファイルのことです。

たとえば、データベースの接続URLは環境毎に異なるのが普通ですし、ログのデバッグレベルも同様だと思います。このような設定値を定義する設定ファイルのことを、ここでは環境依存ファイルと定義します。

Apache Antでの管理方法について

私が経験したあるプロジェクトでは、以下のようなディレクトリ階層で環境依存のファイルを管理していました。

「/」が前に付与されているのはディレクトリを表しています。また、「/」が前に付与されていないのはファイルを表しています。

/MyProject
  | -- /src
  |    | -- /com
  |    |    | -- Sample.java
  |    | -- log4j2.xml
  |    | -- MyProject.properties
  | -- /release
  |    | -- /dev
  |    |    | -- log4j2.xml
  |    |    | -- MyProject.properties
  |    | -- /stage
  |    |    | -- log4j2.xml
  |    |    | -- MyProject.properties
  |    | -- /production
  |    |    | -- log4j2.xml
  |    |    | -- MyProject.properties
  | -- build.xml


ここでは、環境依存ファイルとして「log4j2.xml」と「MyProject.properties」があります。これらを「/release」ディレクトリ配下に、環境毎にディレクトリを作成して(dev、stage、productionの3つ)、その配下に環境依存ファイルをそれぞれの環境用の設定値で編集したものを格納しています。

antでビルドするときには、以下のコマンドで実行します。コマンドの引数にどの環境向けのビルドがしたいのかを、システムプロパティで渡してあげることで、環境毎のビルドを実現します。

以下の例では、ステージング環境用にビルドするためにシステムプロパティ”env”に「stage」を指定しています。

ant -Denv=stage

そのシステムプロパティの情報を元に、環境依存ファイルを該当の環境毎のディレクトリからコピーして、ビルド成果物(jar)を作成します。

因みに、src配下に格納しているプロパティファイルはローカル環境用として設定値を更新して使用しています。ローカル環境では、antでビルドして動作確認するのではなく、Eclipseでビルドして動作確認していたので、ソースパスに置いておけば勝手にプロパティファイルがクラスパスにコピーされて使用することができます。

上記の仕組みを実現するためのビルド設定ファイル(build.xml)の例を以下に示します(今回の説明用に一部省略しています。動作確認はしていませんのでご了承ください。あくまでイメージとして記載しています)。

<project name="MyProject" default="export_jar">

 <!-- 作業ディレクトリを定義 -->
 <property name="work.dir" location="work" />

 <!-- 環境毎の設定 -->
 <condition property="env.prop.dir" value="release/dev">
  <equals arg1="${env}" arg2="dev"/>
 </condition>
 <condition property="env.prop.dir" value="release/stage">
  <equals arg1="${env}" arg2="stage"/>
 </condition>
 <condition property="env.prop.dir" value="release/production">
  <equals arg1="${env}" arg2="production"/>
 </condition>

 <!-- 環境依存ファイルのコピー(移動) -->
 <target name="copy_env" if="env.prop.dir">
  <mkdir dir="${work.dir}"/>
  <copy todir="${work.dir}" overwrite="yes">
   <fileset dir="${env.prop.dir}" />
  </copy>
 </target>

 <!-- コンパイル(jarファイル作成) -->
 <target name="export_jar" depends="copy_env">
  <javac destdir="${work.dir}">
   <src path="src"/>
  </javac>
  <jar jarfile="MyProject.jar">
   <fileset dir="${work.dir}"/>
  </jar>
  <delete dir="${work.dir}"/>
 </target>
 
</project>

おわりに

いかがでしたでしょうか。最近では、Apache Antも使う機会が減ってきているのかもしれませんが、念のためいつか使うかもしれないのでメモしておきました。

今回のやりかたは、設定ファイルを環境毎に事前に作成しておく必要があります。そのため、設定ファイルに変更が発生した場合はすべての環境依存ファイルを修正しないといけないのが面倒なところです。

それをしないために、環境依存ファイルを一つにして、設定値を別の仕組みで置換する方法がこの記事の参考に記載しているサイトで紹介されていました。
なるほど、そのようなやり方があるのだなと、とても勉強になりました。

そのプロジェクトごとに実現したい内容が異なるので、その時々で適切なやり方を選択できるように日々色々な情報を仕入れていきたいものです。

今回はこの辺で失礼いたします。最後までお読みいただきありがとうございました。