Ant × Groovy = 最強!
Groovyには最初からAntBuilderなるクラスが組み込まれていて、それを使って、build.xmlでやっていることと同等のことが出来ることはわかった。Groovy!参照。
しかしそれだとGroovyベースになってしまい、既にbuild.xmlが結構な量ある場合はそれを全部置き換える必要があるため、反発が強そうだ。やりたいこととしてはxmlの弱点であるifやforが使いたいだけなので、jspのようにタグの中にスクリプトを組みこむようなことが出来たらいいなぁと思うんです。でね、色々探していたら、出来たんす!
次のコードをご覧あれ!!
<?xml version="1.0" encoding="Shift_JIS"?> <project name="sample project" basedir="."> <property name="src.dir" value="C:/hogehoge" /> <path id="build.classpath" description="groovyを利用するためgroovyおよびgroovyが利用するライブラリにパスを通す"> <fileset dir="lib"> <include name="**/*.jar" /> </fileset> </path> <taskdef name="groovy" classname="org.codehaus.groovy.ant.Groovy" classpathref="build.classpath"/> <target name="sample"> <echo>${src.dir}</echo> <groovy> println properties['src.dir'] properties['classes.dir'] = 'D:/hogehoge' </groovy> <echo>${classes.dir}</echo> </target> </project>
実行結果
sample: [echo] C:/hogehoge [groovy] C:/hogehoge [echo] D:/hogehoge
ワーイワーイ♪すごくない!?
ant側で定義した「src.dir」をgroovy側で読めるし、groovy側で定義した「classes.dir」をant側でも読めるし!これが出来ればかなりantの世界が広がる♪
まだgroovyの文法に完全に慣れたわけではないので、リファレンス見ながらになっちゃうけど、例えば指定されたディレクトリ配下にtxtファイルがいくつ存在するのかを表示するプログラムは以下。
<target name="file.count"> <groovy> count = 0; new File(properties['src.dir']).listFiles().each { if ( it.name ==~ '.*txt' ) ++count } properties['file.count'] = count </groovy> <echo>${src.dir}配下にある拡張子がtxtのファイルは${file.count}つです。</echo> </target>
すごいよねぇ。
ちなみにJSP内部でrequestやsessionは宣言なしに利用できたようにgroovyタグ内部でもそういった変数が存在します。
上のサンプルで使っている「properties」もそれ。
詳細は以下参照↓
http://groovy.codehaus.org/The+groovy+Ant+Task