ITコンサルの日常

ITコンサル会社に勤務する普通のITエンジニアの日常です。

Antでコンパイルエラーをハンドリングする

なんだか標準のタスクだけだと出来ないっぽいんですが、なにかやり方があるのでしょうか?
ちなみに、スクリプトタグを使って、try〜catchを使ってみたところ、それっぽいことは出来ました。

<project name="squares" default="main" basedir=".">
  <target name="main" depends = "compile">
	<antcall target = "test"/>
  </target>

  <target name="compile">
    <script language="beanshell"> <![CDATA[
		try
		{
			javac = squares.createTask("javac");
			javac.setSrcdir(new org.apache.tools.ant.types.Path(squares, "src"));
			javac.setDestdir(new java.io.File("classes"));
			javac.perform();
		}
		catch(Exception e)
		{
			squares.setProperty("compile.failure", "true");
		}
    ]]> </script>
  </target>

  <target name = "test" if="compile.failure">
    <echo message = "Compile is failure"/>
  </target>
</project>

ほんとうはJavaScriptでやりたかったのですが、BSF2.3rc1とrhino1.6R2とかrhino1.5R4でやってみたところ、NoSuchMethodErrorとか出てちっとも動かなかったので、beanshellとかいうやつにしてみました。
しかし、setSrcdirは、org.apache.tools.ant.types.Pathなのに、setDestdirはjava.io.Fileってのがいまいち統一感なくて解せないと思うのは自分だけでしょうか。
で、そもそもAntでtry〜catchタグみたいのがあればいいんじゃんってのに気づいて、探してみたところ、そのものズバりなものがありました。
http://antelope.tigris.org/
AntのRelated Projectsでも紹介されています。
http://ant.apache.org/projects.html
これを使った場合は、こんな感じ。

<project name="squares" default="main" basedir=".">
  <taskdef name="try" classname="ise.antelope.tasks.TryTask"/>

  <target name="main">
	<try>
		<javac srcdir = "src"
				destdir = "classes"/>
		<catch>
		    <echo message = "Compile is failure."/>
		</catch>
	</try>
  </target>
</project>

すっきり!!
Antelopeのサイトによると、ifとかswitchとかも書けるらしい。Antでバッチ処理とか書けそうな勢いになってきました。どうなんでしょうか。