ant中からgroovyを呼び出す〜あれこれ〜

Antからgroovyが呼び出せるようにする設定はこちらを参照してください。
http://d.hatena.ne.jp/mtoyoshi/20071125/1195955576

基本編

タグ中はgroovyプログラミングが可能。Antで用意した変数はgroovy側でも利用可能です。

<target name="some_target">
	<antcall target="func">
		<param name="sample.flag" value="true" />
	</antcall>
</target>
	
<target name="func">
	<groovy>
		println properties['sample.flag']
	</groovy>
</target>

外部groovyファイルを呼び出す

groovyタグで囲んだ中ではgroovyのプログラムが実行可能。
こうやれば外部groovyファイルも実行可能

<target name="some_target">
	<antcall target="func">
		<param name="sample.flag" value="true" />
	</antcall>
</target>
	
<target name="func">
	<groovy src="print.groovy" />
</target>

で、print.groovyファイルは、

println properties['sample.flag']

です。
ちゃんと値が引き継がれているんですね〜。
これはちょっと感動しました。

groovyタグ内部からAntタスクを呼び出したい

groovyタグはfor文やif文などxmlでは表現しにくい事が簡単に出来て超便利。ただし、とかの慣れ親しんだAntタスクもその中から使いたい。
そんなときはant変数を使う事で可能。

<groovy>
	ant.copy(file:properties['web.inf.dir']+"/struts-config.xml", tofile:"struts-config.xml.bak");
</groovy>

file:とかtofile:とかはcopyタグの属性です。この関係が分かれば、応用はばっちりですね。
なお、このantはAntBuilderというクラスです。

xml処理

XmlParserかXmlSlurperを使う。
これらを使った例はかなり出てくるので、おススメサイトをリンクしておきます。
http://www.ibm.com/developerworks/jp/java/library/j-pg05199/
http://osima.jp/groovy/read-write-xml/


やっかいなのは、struts-config.xmlなんかだとなんていうハイフンを含んだ要素の処理。
上記サンプルを読んだ素直な僕はこういう風に書いたんですが、無情にもエラーになります。

def xml = new XmlParser().parse("struts-config.xml")
print xml.action-mappings.action.size()

正しくは以下のように書くんです。

def xml = new XmlParser().parse("struts-config.xml")
print xml.'action-mappings'.action.size()

これははまりポイントだと思うので覚えておくといいと思います。

はまりポイントついでにいうと、これもエラー。普通にgroovyプログラミングしてたらエラーじゃないんだけどね。groovyプログラミングに夢中だとXML中だってのを忘れてはまるかも。そんなことはないか。

writer << builder.bind{ mkp.yield(book) }

xml中なので、このように書き直さないといけません。

writer &lt;&lt; builder.bind{ mkp.yield(book) }


でもこの最後のbind処理の結果なんですが、eclipseのAntから実行した場合と、groovyConsoleなんかから実行した場合とで結果が違うんだよなー。
groovyConsoleからはxmlになって出力されるんですが、こんな感じで出ちゃうんですよね。。

action[attributes={path=/welcome, type=sample.WelcomeAction}; value=[forward[attributes={name=success, path=/WEB-INF/jsp/login.jsp}; value=[]]]]