ant中からgroovyを呼び出す〜あれこれ〜
Antからgroovyが呼び出せるようにする設定はこちらを参照してください。
http://d.hatena.ne.jp/mtoyoshi/20071125/1195955576
基本編
<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変数を使う事で可能。
<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 << 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=[]]]]