- PR -

eclipseのantでwarタスク実行前後にファイルを書き換えるには?

1
投稿者投稿内容
マリン
常連さん
会議室デビュー日: 2006/05/28
投稿数: 41
投稿日時: 2007-07-26 17:17
Struts+SpringでWebシステムを開発しています。
.propertiesファイルを作ってその中に接続先データベース情報を記述しており、開発時とリリース時のデータベースサーバーの違いはこれを書き換えるだけで対応可能な仕組みにはしてあるのですが、warファイル作成時に自動でこの書き換えをやれないものかと思いました。

warファイルの作成はAll-In-One-Eclipse 3.0.1上でAntのWARタスクを使っており、この前後にReplaceRegExpタスクを入れれば

  1. ReplaceRegExpタスクでリリース環境用に書き換え
  2. warファイル作成
  3. ReplaceRegExpタスクで開発環境用に戻す

というようにできるかな?と思ったのですが、作成されたwarファイルの中身はリリース環境用になっていませんでした。
Antで直接ファイルを書き換えてもeclipseのファイルシステムキャッシュが使われてしまうのが原因のようなのですが、ReplaceRegExpタスク実行後にeclipseのファイルシステムを更新してからwarファイル作成させるような方法はないでしょうか?

ちなみに試したbuild.xmlの定義は以下のような感じです。
コード:
<target name="war">
    <delete file="${app.name}.war" />
    <!-- リリース環境用に書き換え-->
    <replaceregexp file="${propertyFile}"
        match="db.jdbcurl=.*"
        replace="db.jdbcurl=jdbc:oracle:thin:@example.jp:1521:sample/>
    <!-- warファイル作成 -->
    <war destfile="${app.name}.war" webxml="WEB-INF/web.xml">
        <lib dir="${lib.dir}" includes="*.jar" />
        <fileset dir=".">
            <include name="${build.dir}/**/*"/>
            …
        </fileset>
    </war>
    <!-- 開発環境用に戻す -->
    <replaceregexp file="${propertyFile}"
        match="db.jdbcurl=.*"
        replace="db.jdbcurl=jdbc:oracle:thin:@localhost:1521:sample/>
</target>


小僧
ぬし
会議室デビュー日: 2002/08/14
投稿数: 526
投稿日時: 2007-07-26 17:37
AntのパラメータでDB接続用設定値を指定するようにして、リリース用と
開発用のAntビルドを2つ登録した方が良いのではないでしょうか、
開発環境用に戻す処理を含めるよりもシンプルだし。あるいは、
パラメータで参照するAnt外部パラメータファイルを切り替えてあげる
方法なども有りかと。

マリン
常連さん
会議室デビュー日: 2006/05/28
投稿数: 41
投稿日時: 2007-07-26 18:40
ご回答ありがとうございます。

データベース接続情報のようにwarファイル作成時に固定的に決定できるものであればAntターゲットを分離する方法で対応できるとは思うのですが、他にも例えばBuildNumberタスクやTStampタスクとやはりReplaceRegExpタスクを併用することにより、.propertiesファイルに最終ビルド情報を埋め込んでおいてシステムのバージョン情報表示などに簡単に使えるかな?と目論んでいたもので…。
あしゅ
ぬし
会議室デビュー日: 2005/08/05
投稿数: 613
投稿日時: 2007-07-26 19:06
方向性は全然違いますが、ビルドがある程度複雑になってきたら、
Apache Mavenを導入するのも良いと思います。
取っつきにくいのは難点ですが。
kvip
会議室デビュー日: 2003/05/12
投稿数: 12
投稿日時: 2007-07-27 10:57
Ant用のプロパティファイルを環境分用意する方法を取ったことがあります。

大元のBuild.xmlに各環境用のターゲットを用意し、実際の処理は別のBuild.xmlに移譲します。

コード:
<target name="env01">
  <property name="environment" value="env01"/>
  <ant antfile="実際に処理を行うbuild.xml" target="war" inheritall="true"/>
</target>



実際に処理を行うbuild.xmlは、渡されたパラメータを元に環境毎のプロパティファイル(env01.properties)を読み込み、その値を用いてアプリケーション用の設定ファイルなどの特定文字列を置換<replace file="xx" token="xx" value="xx">し、それをWarに固める方法を取りました。

eclipse上で実行したわけではありませんが、参考までに。
マリン
常連さん
会議室デビュー日: 2006/05/28
投稿数: 41
投稿日時: 2007-08-10 16:32
最初の投稿では「eclipseのファイルシステムキャッシュが使われてしまうのが原因」と思いこんでいましたが、その後も調べていたところ、書き換えているファイルのパスが違っていた(eclipseのソース・フォルダーと出力フォルダーの理解が不十分だった)のが原因でした。

eclipseのパッケージエクスプローラー上では該当ファイルは以下のような階層構造で見えていましたが
コード:
プロジェクトフォルダ
└WEB-INF/etc
 └system.properties


実際にwarファイルに含まれるファイルの階層構造は以下の通りでした。
コード:
プロジェクトフォルダ
└WEB-INF
 └classes
  └system.properties



これでファイル書き換えが可能になったので、さらに皆さんがおっしゃるようにパラメータで切り替えてwarファイルを作成するようにしてbuild.xmlもすっきりしました。お騒がせしました。
1

スキルアップ/キャリアアップ(JOB@IT)