Gradle 暗黙 ant オブジェクト 何か?

GradleでAntタスクを実行する時に使用するantオブジェクトについて調べてみましたので記事にします。

GradleでAntタスクを実行したい時は、以下の用にいきなりantオブジェクトを使用してAntタスクを起動できます。

ant.echo('Hello,GradleAntTask!')

この時使用されるantオブジェクトとは一体何か?を調べればGradleにおけるantの使用が分かるのではないか?と考え、まずクラスとその親クラスを調べてみました。





単純にクラスと親クラスを調べるタスクです。
実行結果

:antTest
org.gradle.api.internal.project.DefaultAntBuilder
org.gradle.api.internal.project.ant.BasicAntBuilder
org.gradle.api.AntBuilder
groovy.util.AntBuilder
groovy.util.BuilderSupport
groovy.lang.GroovyObjectSupport
java.lang.Object



この結果からすると、普通のGroovyのAntBuilderとさほど変わらない気がします。


続いて、Builderパターンですので、MetaClassを取得してメソッド一覧を取得して見ました。



このタスクによって各メタクラスのメソッド一覧がテキスト出力されるので、確認してみます。

org.gradle.api.internal.project.DefaultAntBuilder************************************
1public boolean java.lang.Object.equals(java.lang.Object)
2public final native java.lang.Class java.lang.Object.getClass()
3public native int java.lang.Object.hashCode()
4public final native void java.lang.Object.notify()
5public final native void java.lang.Object.notifyAll()
6public java.lang.String java.lang.Object.toString()
7public final void java.lang.Object.wait() throws java.lang.InterruptedException
8public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
9public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
10public groovy.lang.MetaClass groovy.lang.GroovyObjectSupport.getMetaClass()
11public java.lang.Object groovy.lang.GroovyObjectSupport.getProperty(java.lang.String)
12public java.lang.Object groovy.lang.GroovyObjectSupport.invokeMethod(java.lang.String,java.lang.Object)
13public void groovy.lang.GroovyObjectSupport.setMetaClass(groovy.lang.MetaClass)
14public void groovy.lang.GroovyObjectSupport.setProperty(java.lang.String,java.lang.Object)
15public java.lang.Object groovy.util.BuilderSupport.invokeMethod(java.lang.String)
16public java.lang.Object groovy.util.BuilderSupport.invokeMethod(java.lang.String,java.lang.Object)
17public org.apache.tools.ant.Project groovy.util.AntBuilder.getAntProject()
18public org.apache.tools.ant.helper.AntXMLContext groovy.util.AntBuilder.getAntXmlContext()
19public org.apache.tools.ant.Project groovy.util.AntBuilder.getProject()
20public abstract java.util.Map org.gradle.api.AntBuilder.getProperties()
21public abstract java.util.Map org.gradle.api.AntBuilder.getReferences()
22public abstract void org.gradle.api.AntBuilder.importBuild(java.lang.Object)
23public java.util.Map org.gradle.api.internal.project.ant.BasicAntBuilder.getProperties()
24public java.util.Map org.gradle.api.internal.project.ant.BasicAntBuilder.getReferences()
25public void org.gradle.api.internal.project.ant.BasicAntBuilder.importBuild(java.lang.Object)
26public static void .__$swapInit()
27public java.util.Map .getProperties()
28public java.util.Map .getReferences()
29public void .importBuild(java.lang.Object)
30public java.lang.Object .invokeMethod(java.lang.String,java.lang.Object)
31public java.lang.Object .propertyMissing(java.lang.String)
32public java.lang.Object .propertyMissing(java.lang.String,java.lang.Object)

合計32個のメソッドが定義されていました。このオブジェクトのクラスからgroovy.util.AntBuilderクラスまで、特にメソッドの変化は見られませんでした。これだけでは確認できなかったのですが、おそらくAntタスクは16行目のinvokeMethodあたりをたくさん使用して記述しているのではないかと思います。基本はgroovy.util.AntBuilderそのままではないでしょうか。Gradle分のソースについてはまだ確認できておりませんが、確認できたらまた更新します。

ソースの確認

20110924追記

org.gradle.api.internal.project.DefaultAntBuilder
https://github.com/gradle/gradle/blob/master/subprojects/core/src/main/groovy/org/gradle/api/internal/project/DefaultAntBuilder.groovy
やっぱり、invokeMethodでsuperクラスに処理を渡していますね。また、propertyMissingを定義して、既に定義されていないプロパティが設定された時はAntのsetUserPropertyを呼び出しています。


org.gradle.api.internal.project.ant.BasicAntBuilder
https://github.com/gradle/gradle/blob/master/subprojects/core/src/main/groovy/org/gradle/api/internal/project/ant/BasicAntBuilder.java
ここではコンストラクタでlastCompletedNode、collectorTarget、childrenを直接getできるようにしていますね。また、nodeCompletedやdoInvokeMethodなどgroovy.util.AntBuilderのメソッドをオーバーライドしています。


org.gradle.api.AntBuilder
https://github.com/gradle/gradle/blob/master/subprojects/core/src/main/groovy/org/gradle/api/AntBuilder.java
ここではabstractメソッドばかり定義されているようです。


groovy.util.AntBuilder
http://git.codehaus.org/gitweb.cgi?p=groovy-git.git;a=blob;f=src/main/groovy/util/AntBuilder.java;h=b232f39b6dbe16009b987c842fbb212a2e288774;hb=HEAD
そして、ここに行き着くわけですね。


まとめ

感じとしては、自分なりのフィールドの定義が簡単にできるようになっているのと、メソッドの挙動が追加されているのが見受けられました。AntBuilderから大幅に変わっているわけではないようですね。