※ 商品のリンクをクリックして何かを購入すると私に少額の報酬が入ることがあります【広告表示】 Antのタスクを作成してみました。
発端は、flex-config.xmlの特定の箇所を部分的に置換したいという欲求でした。
flex-config.xmlとは
MacromediaのWebアプリケーションで、xmlを動的にflashに変換をするリッチクライアントです。
flex-config.xmlはwell-formedのxmlではありません。簡単に言うと、dtdを宣言していません。
よって、外部ファイルのインクルードができないのです(正確にはxsdでもないから?)。
にもかかわらず、debugモードと本番モードの設定はflex-config.xmlにあり、また悪いことにstruts-configのようにアプリケーションに関する記述もここに行います。
本番にデプロイする際に(J2EEなのでwarを作成するタイミング)、いちいち設定フラグの書き換えを行わなければなりません。
そこで、デプロイ時に該当箇所を置換してやろうと考えました。
Antの標準タスクにも、リソースバンドルにかかれた情報を元に文字列を置換するというタスクがあります。
ただし、主に国際化を目的に考えられているタスクなので、僕の要求に対してはあまりマッチしていませんでした。
前提1:Antのタスクを作成する場合は、org.apache.tools.ant.Taskを継承する必要があります。
org.apache.tools.ant.Taskはant.jarに含まれています。
前提2:Taskを継承したクラスには、public void execute() throws BuildException というメソッドを定義します。
Antから作成したタスクを呼ぶと、executeメソッドが呼ばれます。
前提3:publicなセッターを持つプロパティをクラスに用意すれば、タスクタグから同名の値として渡すことができます
作成したタスクは次のようにbuild.xmlに定義します。
<taskdef name="ereplace" classname="net.everes.util.ant.EReplaceTask" classpath="./lib/er-task-0.1.jar" />
nameには、そのbuild.xmlで使用する際の名前を適当に決めます。
classnameは、作成したクラスを指定します。
classpathには作成したクラスへの参照が可能なクラスパスを指定します。ここではjarにしまったことにしています。
この置換タスクは次のように使用します。build.xmlはxmlファイルなので、<等はxml式にエスケープして書く必要があります。
<ereplace targetFile="WEB-INF/flex/flex-config.xml" target="<production-mode>[\s\w]*</production-mode>" value="<production-mode>true</production-mode>" />