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そして、ここに行き着くわけですね。