第17章 GradleからAntを使う

Gradle provides excellent integration with Ant. You can use individual Ant tasks or entire Ant builds in your Gradle builds. In fact, you will find that it's far easier and more powerful using Ant tasks in a Gradle build script, than it is to use Ant's XML format. You could even use Gradle simply as a powerful Ant task scripting tool.

Gradleは優れたAntとの統合機能を提供しています。 Gradleビルドの中で、個別のAntタスクや、Antビルド全体を利用することができます。 実際、AntのXMLフォーマットを利用するよりも、Gradleビルドの中でAntタスクを使う方がはるかに簡単でより強力であることに気づくでしょう。 Gradleを単に強力なAntスクリプティングツールとして使ってもよいくらいです。

Ant can be divided into two layers. The first layer is the Ant language. It provides the syntax for the build.xml, the handling of the targets, special constructs like macrodefs, and so on. In other words, everything except the Ant tasks and types. Gradle understands this language, and allows you to import your Ant build.xml directly into a Gradle project. You can then use the targets of your Ant build as if they were Gradle tasks.

Antは二つのレイヤーに分割できます。 第一のレイヤーはAnt言語で、build.xmlの文法やターゲットの取り扱い、およびmacrodefのような特別な構成要素などを提供します。 別の言い方では、Antタスクとタイプを除くすべてのものです。 Gradleはこの言語を理解し、GradleプロジェクトにAntのbuild.xmlを直接インポートすることを可能にしています。 そのため、AntビルドのターゲットをGradleのタスクであるかのように利用することができます。

The second layer of Ant is its wealth of Ant tasks and types, like javac, copy or jar. For this layer Gradle provides integration simply by relying on Groovy, and the fantastic AntBuilder.

Antの第二のレイヤーは、javaccopyjarといった豊富なAntタスクやタイプの資産です。 このレイヤーに対してはGroovyのすばらしいAntBuilderが利用できるため、Gradleはシンプルな統合機能を提供するのみです。

Finally, since build scripts are Groovy scripts, you can always execute an Ant build as an external process. Your build script may contain statements like:"ant clean compile".execute(). [14]

最後に、ビルドスクリプトはGroovyスクリプトなので、いつでもAntビルドを外部プロセスとして実行できます。 ビルドスクリプトは"ant clean compile".execute()のような実行文を含んでいてもかまいません。 [15]

You can use Gradle's Ant integration as a path for migrating your build from Ant to Gradle. For example, you could start by importing your existing Ant build. Then you could move your dependency declarations from the Ant script to your build file. Finally, you could move your tasks across to your build file, or replace them with some of Gradle's plugins. This process can be done in parts over time, and you can have a working Gradle build during the entire process.

GradleのAnt統合機能を、AntからGradleへのビルド移行パスとして利用することもできます。 例えば、既存のAntビルドをインポートするところから始めてもよいでしょう。 それから、依存関係の宣言をAntスクリプトから新しいビルドファイルへ移動していきます。 最後に、タスクを新しいビルドファイルへ移動するか、Gradleプラグインで置き換えます。 このプロセスは一部分づつ段階的に実施でき、プロセス全体を通してGradleによるビルドを利用できます。

17.1. ビルドでのAntタスクとタイプの利用Using Ant tasks and types in your build

In your build script, a property called ant is provided by Gradle. This is a reference to an AntBuilder instance. This AntBuilder is used to access Ant tasks, types and properties from your build script. There is a very simple mapping from Ant's build.xml format to Groovy, which is explained below.

ビルドスクリプトではGradleによってプロパティantが提供されます。 これはAntBuilderインスタンスへの参照です。 このAntBuilderはビルドスクリプトからAntタスクやタイプ、プロパティへのアクセスに利用します。 Antのbuild.xmlフォーマットからGroovyへのマッピングは非常に簡単です。 以下で説明します。

You execute an Ant task by calling a method on the AntBuilder instance. You use the task name as the method name. For example, you execute the Ant echo task by calling the ant.echo() method. The attributes of the Ant task are passed as Map parameters to the method. Below is an example of the echo task. Notice that we can also mix Groovy code and the Ant task markup. This can be extremely powerful.

Antタスクを実行するには、AntBuilderインスタンスのメソッドを呼び出します。 Antタスク名がメソッド名になります。 例えば、Antのechoタスクを実行する場合は、ant.echo()メソッドを呼び出します。 Antタスクの属性は、メソッドにMap型のパラメータとして渡します。 以下はechoタスクを実行するサンプルです。 GroovyコードとAntタスクのマークアップを混在できることに注意してください。 これは非常に強力です。

例17.1 Antタスクの利用

build.gradle

task hello << {
    String greeting = 'hello from Ant'
    ant.echo(message: greeting)
}

gradle hello の出力

> gradle hello
:hello
[ant:echo] hello from Ant

BUILD SUCCESSFUL

Total time: 1 secs

You pass nested text to an Ant task by passing it as a parameter of the task method call. In this example, we pass the message for the echo task as nested text:

Antタスクのメソッド呼び出しのパラメータとして渡してやることで、ネストされたテキストをAntタスクに渡すことができます。 この例では、echoタスクに対するメッセージをネストされたテキストとして渡しています。

例17.2 Antタスクにネストされたテキストを渡す

build.gradle

task hello << {
    ant.echo('hello from Ant')
}

gradle hello の出力

> gradle hello
:hello
[ant:echo] hello from Ant

BUILD SUCCESSFUL

Total time: 1 secs

You pass nested elements to an Ant task inside a closure. Nested elements are defined in the same way as tasks, by calling a method with the same name as the element we want to define.

Antタスクにネストされた要素を渡す場合はクロージャの内部に記述します。 ネストされた要素はタスクと同じように、指定したい要素名と同じメソッドを呼び出すことで指定できます。

例17.3 Antタスクにネストされた要素を渡す

build.gradle

task zip << {
    ant.zip(destfile: 'archive.zip') {
        fileset(dir: 'src') {
            include(name: '**.xml')
            exclude(name: '**.java')
        }
    }
}

You can access Ant types in the same way that you access tasks, using the name of the type as the method name. The method call returns the Ant data type, which you can then use directly in your build script. In the following example, we create an Ant path object, then iterate over the contents of it.

Antタスクにアクセスするのと同じ方法、すなわちタイプ名をメソッド名として利用することでAntタイプにアクセスできます。 メソッド呼び出しの戻り値はAntデータ型なので、ビルドスクリプトの中で直接利用できます。 次の例では、Antのpathオブジェクトを生成し、その内容をすべてイテレートしています。

例17.4 Antタイプの利用

build.gradle

task list << {
    def path = ant.path {
        fileset(dir: 'libs', includes: '*.jar')
    }
    path.list().each {
        println it
    }
}

More information about AntBuilder can be found in 'Groovy in Action' 8.4 or at the Groovy Wiki

AntBuilderに関する詳細は「Groovy in Action」の8.4節、ないしはGroovy Wikiを参照してください。

17.1.1. ビルドでカスタムAntタスクを使うUsing custom Ant tasks in your build

To make custom tasks available in your build, you can use the taskdef (usually easier) or typedef Ant task, just as you would in a build.xml file. You can then refer to the custom Ant task as you would a built-in Ant task.

ビルドでカスタムタスクを有効にするためには、 build.xmlファイルと同じくAntタスクのtaskdef(大抵はこちらの方が簡単です)かtypedefを利用します。 これにより組み込みのAntタスクと同様にカスタムAntタスクが参照できるようになります。

例17.5 カスタムAntタスクの利用

build.gradle

task check << {
    ant.taskdef(resource: 'checkstyletask.properties') {
        classpath {
            fileset(dir: 'libs', includes: '*.jar')
        }
    }
    ant.checkstyle(config: 'checkstyle.xml') {
        fileset(dir: 'src')
    }
}

You can use Gradle's dependency management to assemble the classpath to use for the custom tasks. To do this, you need to define a custom configuration for the classpath, then add some dependencies to the configuration. This is described in more detail in 「依存関係の定義方法 How to declare your dependencies.

カスタムタスクを利用するために必要なクラスパスの設定には、Gradleの依存関係管理機能が利用できます。 このために、クラスパスに対するカスタムコンフィグレーションを定義して、コンフィグレーションに対する依存関係を追加する必要があります。 詳細については「依存関係の定義方法 How to declare your dependenciesに記述されています。

例17.6 カスタムAntタスクに対するクラスパスの宣言

build.gradle

configurations {
    pmd
}

dependencies {
    pmd group: 'pmd', name: 'pmd', version: '4.2.5'
}

To use the classpath configuration, use the asPath property of the custom configuration.

クラスパスを設定するには、カスタムコンフィグレーションのasPathプロパティを利用します。

例17.7 カスタムAntタスクと依存関係管理を併用

build.gradle

task check << {
    ant.taskdef(name: 'pmd',
                classname: 'net.sourceforge.pmd.ant.PMDTask',
                classpath: configurations.pmd.asPath)
    ant.pmd(shortFilenames: 'true',
            failonruleviolation: 'true',
            rulesetfiles: file('pmd-rules.xml').toURI().toString()) {
        formatter(type: 'text', toConsole: 'true')
        fileset(dir: 'src')
    }
}

17.2. AntビルドのインポートImporting an Ant build

You can use the ant.importBuild() method to import an Ant build into your Gradle project. When you import an Ant build, each Ant target is treated as a Gradle task. This means you can manipulate and execute the Ant targets in exactly the same way as Gradle tasks.

ant.importBuild()メソッドを利用して、GradleプロジェクトにAntビルドをインポートできます。 Antビルドをインポートした場合、各AntターゲットはGradleのタスクとして扱われます。 つまり、AntターゲットとGradleタスクをまったく同一の方法で操作することができるということです。

例17.8 Antビルドのインポート

build.gradle

ant.importBuild 'build.xml'

build.xml

<project>
    <target name="hello">
        <echo>Hello, from Ant</echo>
    </target>
</project>

gradle hello の出力

> gradle hello
:hello
[ant:echo] Hello, from Ant

BUILD SUCCESSFUL

Total time: 1 secs

You can add a task which depends on an Ant target:

Antターゲットに依存するタスクを追加することもできます:

例17.9 Antターゲットに依存するタスク

build.gradle

ant.importBuild 'build.xml'

task intro(dependsOn: hello) << {
    println 'Hello, from Gradle'
}

gradle intro の出力

> gradle intro
:hello
[ant:echo] Hello, from Ant
:intro
Hello, from Gradle

BUILD SUCCESSFUL

Total time: 1 secs

Or, you can add behaviour to an Ant target:

Antターゲットにふるまいを追加することも可能です:

例17.10 Antターゲットにふるまいを追加

build.gradle

ant.importBuild 'build.xml'

hello << {
    println 'Hello, from Gradle'
}

gradle hello の出力

> gradle hello
:hello
[ant:echo] Hello, from Ant
Hello, from Gradle

BUILD SUCCESSFUL

Total time: 1 secs

It is also possible for an Ant target to depend on a Gradle task:

Gradleタスクに依存するAntターゲットを定義することも可能です:

例17.11 Ant target that depends on Gradle task

build.gradle

ant.importBuild 'build.xml'

task intro << {
    println 'Hello, from Gradle'
}

build.xml

<project>
    <target name="hello" depends="intro">
        <echo>Hello, from Ant</echo>
    </target>
</project>

gradle hello の出力

> gradle hello
:intro
Hello, from Gradle
:hello
[ant:echo] Hello, from Ant

BUILD SUCCESSFUL

Total time: 1 secs

Sometimes it may be necessary to “rename” the task generated for an Ant target to avoid a naming collision with existing Gradle tasks. To do this, use the AntBuilder.importBuild() method.

例17.12 Renaming imported Ant targets

build.gradle

ant.importBuild('build.xml') { antTargetName ->
    'a-' + antTargetName
}

build.xml

<project>
    <target name="hello">
        <echo>Hello, from Ant</echo>
    </target>
</project>

gradle a-hello の出力

> gradle a-hello
:a-hello
[ant:echo] Hello, from Ant

BUILD SUCCESSFUL

Total time: 1 secs

Note that while the second argument to this method should be a Transformer, when programming in Groovy we can simply use a closure instead of an anonymous inner class (or similar) due to Groovy's support for automatically coercing closures to single-abstract-method types.

17.3. AntプロパティとリファレンスAnt properties and references

There are several ways to set an Ant property, so that the property can be used by Ant tasks. You can set the property directly on the AntBuilder instance. The Ant properties are also available as a Map which you can change. You can also use the Ant property task. Below are some examples of how to do this.

Antタスクで利用できるようにAntプロパティを設定する方法は複数あります。 AntBuilderインスタンスのプロパティを直接設定できます。 Antプロパティは変更可能なMapとしても利用可能です。 Antのpropertyタスクも利用できます。 以下はこれらをどのように実行するのかを示すサンプルです。

例17.13 Antプロパティの設定

build.gradle

ant.buildDir = buildDir
ant.properties.buildDir = buildDir
ant.properties['buildDir'] = buildDir
ant.property(name: 'buildDir', location: buildDir)

build.xml

<echo>buildDir = ${buildDir}</echo>

Many Ant tasks set properties when they execute. There are several ways to get the value of these properties. You can get the property directly from the AntBuilder instance. The Ant properties are also available as a Map. Below are some examples.

多くのAntタスクは実行時にプロパティを設定します。 これらのプロパティを取得する方法も複数あります。 AntBuilderインスタンスからプロパティを直接取得できます。 AntプロパティはMapとしても参照可能です。 以下はサンプルです。

例17.14 Antプロパティの取得

build.xml

<property name="antProp" value="a property defined in an Ant build"/>

build.gradle

println ant.antProp
println ant.properties.antProp
println ant.properties['antProp']

There are several ways to set an Ant reference:

Antリファレンスを設定する方法は複数あります:

例17.15 Antリファレンスの設定

build.gradle

ant.path(id: 'classpath', location: 'libs')
ant.references.classpath = ant.path(location: 'libs')
ant.references['classpath'] = ant.path(location: 'libs')

build.xml

<path refid="classpath"/>

There are several ways to get an Ant reference:

Antリファレンスを取得する方法も複数あります:

例17.16 Antリファレンスの取得

build.xml

<path id="antPath" location="libs"/>

build.gradle

println ant.references.antPath
println ant.references['antPath']

17.4. APIAPI

The Ant integration is provided by AntBuilder.

Ant統合機能はAntBuilderによって提供されています。



[14] In Groovy you can execute Strings. To learn more about executing external processes with Groovy have a look in 'Groovy in Action' 9.3.2 or at the Groovy wiki

[15] Groovyでは文字列をコマンドとして実行できます。 外部プロセスの実行について詳しく学ぶには、「Groovy in Action」の9.3.2節か、Groovy Wikiを参照してください。