SAStrutsの環境別設定ファイルを build.xmlで切り替える


今回は、WARファイルを作成する手順を Ant を利用してバッチ化します。
掲載する build.xmlを基にして自分のプロジェクトに適用してみてはどうでしょうか。

よくあるケース

SAStrutsを利用したプロジェクトで、本番環境にデプロイするWARファイルを作成する際に、
本番環境用の設定ファイルを手動で上書きして、Eclipseのエクスポート機能や、Tomcatプラグインで出力しているケースがあります。


この方法だと手動の部分でミスする可能性があります。
さらに、再び開発を行う場合には、設定ファイルを開発用に戻す必要があり面倒です。


また、Tomcatプラグインで出力した場合に、
WARファイルの中に不必要なファイル(ライブラリのソースファイル等)も混在しているため、
本番環境にデプロイした後、サービスが起動するまで時間がかかります。

本番環境用の設定ファイルを準備

まず、本番環境用の設定ファイルを準備しておきます。
[src/main/resources]に [production]パッケージを作成して、本番環境用の設定ファイルを準備します。
http://dl.dropbox.com/u/1047086/20100422/01.JPG


ここでは、[jdbc.dicon]と [log4j.properties]を準備しました。

build.xmlを準備

こんな感じ。
適宜、[プロジェクト名]と[Tomcatパス]は変更して下さい。

<?xml version="1.0" encoding="UTF-8"?>
<project name="[プロジェクト名]" default="ProductionWar">
    <description>WARファイル作成 build.xml</description>
    <property name="build.FilePath" value="target/[プロジェクト名].war"/>
    <property name="build.OutputDir" value="src/main/webapp/WEB-INF/classes"/>
    <property name="build.SourceDir" value="src/main/java"/>
    <property name="build.ResourceDir" value="src/main/resources"/>
    <property name="build.webinf" value="src/main/webapp/WEB-INF"/>
    <!-- 本番用設定ファイルパス -->
    <property name="build.Production" value="src/main/resources/production"/>
    
    <!-- ビルドに必要なファイル群 -->
    <path id="build.classpath">
        <fileset dir="lib">
            <include name="*.jar"/>
        </fileset>
        <fileset dir="${build.webinf}/lib">
            <include name="*.jar"/>
        </fileset>
        <fileset dir="[Tomcatパス]\lib">
            <include name="*.jar"/>
        </fileset>
    </path>
    
    <!-- 本番環境用のWARファイルを作成 -->
    <target name="ProductionWar">
        <antcall target="Clean"/>
        <antcall target="Compile"/>
        <antcall target="CopyProductionFile"/>
        <antcall target="Package"/>
        <!-- 再度コンパイルをすることで開発環境の状態に戻します。 -->
        <antcall target="Compile"/>
    </target>

    <!-- コンパイル先を整備 -->
    <target name="Clean">
        <delete dir="target"/>
        <mkdir dir="target"/>
        <delete>
            <fileset dir="${build.OutputDir}"/>
        </delete>
    </target>
    
    <!-- コンパイル -->
    <target name="Compile">
        <javac destdir="${build.OutputDir}"
            encoding="UTF-8"
            nowarn="false"
            debug="true"
            optimize="false"
            deprecation="true"
            target="1.6"
            verbose="false"
            fork="false"
            source="1.6">
            <src>
                <pathelement location="${build.SourceDir}"/>
            </src>
            <classpath refid="build.classpath"/>
        </javac>
        <copy todir="${build.OutputDir}" overwrite="true">
            <fileset dir="${build.ResourceDir}">
                <include name="*.dicon"/>
                <include name="*.properties"/>
                <!-- env.txtを含まなければCoolDeployとなります -->
            </fileset>
        </copy>
    </target>
    
    <!-- 本番環境用の設定ファイルをコピー -->
    <target name="CopyProductionFile">
        <copy todir="${build.OutputDir}" overwrite="true">
            <fileset dir="${build.Production}">
                <include name="*.dicon"/>
                <include name="*.properties"/>
            </fileset>
        </copy>
    </target>

    <!-- WARファイルを作成 -->
    <target name="Package">
        <war destfile="${build.FilePath}" webxml="${basedir}/${build.webinf}/web.xml">
            <webinf dir="${basedir}/${build.webinf}/">
                <include name="*.xml"/>
                <include name="*.tld"/>
                <include name="view/**"/>
                <exclude name="web.xml"/>
            </webinf>
            <lib dir="${basedir}/${build.webinf}/lib" includes="*.jar"/>
            <classes dir="${build.OutputDir}"/>
            <fileset dir="${basedir}/src/main/webapp">
                <include name="css/**"/>
                <include name="img/**"/>
                <include name="js/**"/>
                <include name="favicon.ico"/>
            </fileset>
        </war>
    </target>
</project>

Antでbuild.xmlを実行

EclipseでAntビューを表示して、build.xmlの[ProductionWar]タスクを実行して下さい。
コンソールに「BUILD SUCCESSFUL」と表示されれば、[target]フォルダに [プロジェクト名].warが作成されています。
http://dl.dropbox.com/u/1047086/20100422/02.JPG

WARファイルを確認

一応、WARファイルの中身を確認してみましょう。
[WEB-INF/classes]の直下に設定ファイルが格納されているので、
本番環境用の設定ファイルに置き換わっているのを確認して下さい。
http://dl.dropbox.com/u/1047086/20100422/03.JPG


あとは、本番環境にWARファイルをデプロイしましょう。

まとめ

なんども繰り返す作業は自動化しちゃいましょう!
そう!DRY (Don't Repeat Yourself)です!

ではでは( ´Д`)ノ