Gradle 提供了對 Ant 的優秀集成。可以在你的 Gradle 構建中,使用單獨的 Ant 任務或整個 Ant 構建。事實上,你會發現在 Gradle 中使用 Ant 任務比使用 Ant 的 XML 格式更容易也更強大。你甚至可以只把 Gradle 當作一個強大的 Ant 任務腳本的工具。
Ant 可以分為兩層。第一層是 Ant 的語言。它提供了用于 build.xml,處理的目標,特殊的構造方法比如宏,還有其他等等的語法。換句話說,除了 Ant 任務和類型之外全部都有。Gradle 理解這種語言,并允許您直接導入你的 Ant build.xml 到 Gradle 項目中。然后你可以使用你的 Ant 構建中的 target,就好像它們是 Gradle task 一樣。
Ant 的第二層是其豐富的 Ant 任務和類型,如 javac、copy或jar。這一層 Gradle 只靠 Groovy 和非常棒的 AntBuilder,對其提供了集成。
最后,由于構建腳本是 Groovy 腳本,所以您始終可以作為一個外部進程來執行 Ant 構建。你的構建腳本可能包含有類似這樣的語句:`"ant clean compile".execute()`?(在 Groovy 中,你可以執行字符串。了解更多關于執行外部進程,請查看 9.3.2 的'Groovy in Action'或者 Groovy wiki)
你可以把 Gradle 的 Ant 集成當成一個路徑,將你的構建從 Ant 遷移至 Gradle 。例如,你可以通過導入您現有的 Ant 構建來開始。然后,可以將您的依賴聲明從 Ant 腳本移到您的構建文件。最后,您可以將整個任務移動到您的構建文件,或者把它們替換為一些 Gradle 插件。這個過程可以隨著時間一點點完成,并且在這整個過程當中你的 Gradle 構建都可以使用用。
## [](https://github.com/waylau/Gradle-2-User-Guide/blob/master/Chapter%2017.%20Using%20Ant%20from%20Gradle%20%E4%BB%8E%20Gradle%20%E4%BD%BF%E7%94%A8%20Ant.md#171-using-ant-tasks-and-types-in-your-build-在你的構建中使用-ant-的任務和類型)17.1\. Using Ant tasks and types in your build 在你的構建中使用 Ant 的任務和類型
在構建腳本中,Gradle 提供了一個名為 ant 的屬性。它指向一個?[AntBuilder](http://gradle.org/docs/current/javadoc/org/gradle/api/AntBuilder.html)?實例。AntBuilder 用于從你的構建腳本中訪問 Ant 任務、 類型和屬性。從 Ant 的 build.xml 格式到 Groovy 之間有一個非常簡單的映射,下面解釋。
通過調用 AntBuilder 實例上的一個方法,可以執行一個 Ant 任務。你可以把任務名稱當作方法名稱使用。例如,你可以通過調用 ant.echo() 方法執行 Ant 的 echo 任務。Ant 任務的屬性會作為 Map 參數傳給該方法。下面是執行 echo 任務的例子。請注意我們還可以混合使用 Groovy 代碼和 Ant 任務標記。這將會非常強大。
Example 17.1\. Using an Ant task
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
~~~
你可以把一個嵌套文本,通過作為任務方法調用的參數,把它傳給一個 Ant 任務。在此示例中,我們將把作為嵌套文本的消息傳給 echo 任務:
Example 17.2\. Passing nested text to an Ant task
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
~~~
你可以在一個閉包里把嵌套的元素傳給一個 Ant 任務。嵌套元素的定義方式與任務相同,通過調用與我們要定義的元素一樣的名字的方法
Example 17.3\. Passing nested elements to an Ant task
build.gradle
~~~
task zip << {
ant.zip(destfile: 'archive.zip') {
fileset(dir: 'src') {
include(name: '**.xml')
exclude(name: '**.java')
}
}
}
~~~
您可以用訪問任務同樣的方法,把類型名字作為方法名稱,訪問 Ant 類型。方法調用返回 Ant 數據類型,然后可以在構建腳本中直接使用。在以下示例中,我們創建一個 Ant 的 path 對象,然后循環訪問它的內容。
Example 17.4\. Using an Ant type
build.gradle
~~~
task list << {
def path = ant.path {
fileset(dir: 'libs', includes: '*.jar')
}
path.list().each {
println it
}
}
~~~
更多有關 AntBuilder 見 8.4 的'Groovy in Action' 或者?[Groovy Wiki](http://groovy.codehaus.org/Using+Ant+from+Groovy)
### [](https://github.com/waylau/Gradle-2-User-Guide/blob/master/Chapter%2017.%20Using%20Ant%20from%20Gradle%20%E4%BB%8E%20Gradle%20%E4%BD%BF%E7%94%A8%20Ant.md#1711-using-custom-ant-tasks-in-your-build-在構建中使用自定義的-ant-任務)17.1.1\. Using custom Ant tasks in your build 在構建中使用自定義的 Ant 任務
要使自定義任務在您的構建中可用,你可以使用 Ant 任務 taskdef(通常更容易) 或 typedef,就像在 build.xml 文件中一樣。然后,您可以像引用內置的 Ant 任務一樣引用自定義 Ant 任務。
Example 17.5\. Using a custom Ant task
build.gradle
~~~
task check << {
ant.taskdef(resource: 'checkstyletask.properties') {
classpath {
fileset(dir: 'libs', includes: '*.jar')
}
}
ant.checkstyle(config: 'checkstyle.xml') {
fileset(dir: 'src')
}
}
~~~
你可以使用 Gradle 的依賴管理組合類路徑,以用于自定義任務。要做到這一點,你需要定義一個自定義配置的類路徑中,然后將一些依賴項添加到配置中。這在 50.4章節,“如何聲明你的依賴”有更詳細的描述。
Example 17.6\. Declaring the classpath for a custom Ant task
build.gradle
~~~
configurations {
pmd
}
dependencies {
pmd group: 'pmd', name: 'pmd', version: '4.2.5'
}
~~~
若要使用類路徑配置,請使用自定義配置里的 asPath 屬性。
Example 17.7\. Using a custom Ant task and dependency management together
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') } }
## [](https://github.com/waylau/Gradle-2-User-Guide/blob/master/Chapter%2017.%20Using%20Ant%20from%20Gradle%20%E4%BB%8E%20Gradle%20%E4%BD%BF%E7%94%A8%20Ant.md#172-importing-an-ant-build-導入-ant-的構建)17.2\. Importing an Ant build 導入 Ant 的構建
你可以使用 ant.importBuild() 方法來向 Gradle 項目導入一個 Ant 構建。當您導入一個 Ant 構建時,每個 Ant 目標被視為一個 Gradle 任務。這意味著你可以用與 Gradle 任務完全相機的方式操縱和執行 Ant 目標。
Example 17.8\. Importing an Ant build
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
~~~
您可以添加一個依賴于 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
~~~
或者,您可以將行為添加到 Ant 目標中:
Example 17.10\. Adding behaviour to an Ant target
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
~~~
它也可以用于一個依賴于 Gradle 任務的 Ant 目標:
Example 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‘
~~~
有時可能需要“改名”來避免 Ant target 生成的 task 與現有的 Gradle task 在命名上沖突。使用?[AntBuilder.importBuild()](http://gradle.org/docs/current/javadoc/org/gradle/api/AntBuilder.html#importBuild(java.lang.Object,%20org.gradle.api.Transformer))?方法
Example 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
~~~
請注意,雖然這個方法的第二個參數應該是一個?[Transformer](http://gradle.org/docs/current/javadoc/org/gradle/api/Transformer.html),在 Groovy 編程時可以使用簡單的閉包而不是一個匿名內部類(或類似的),因為?[Groovy 的支持自動強制關閉 single-abstract-method(單一的抽象方法)的類型](http://mrhaki.blogspot.ie/2013/11/groovy-goodness-implicit-closure.html)。
## [](https://github.com/waylau/Gradle-2-User-Guide/blob/master/Chapter%2017.%20Using%20Ant%20from%20Gradle%20%E4%BB%8E%20Gradle%20%E4%BD%BF%E7%94%A8%20Ant.md#173-ant-properties-and-references-關于-ant-的屬性和引用)17.3\. Ant properties and references 關于 Ant 的屬性和引用
有幾種方法來設置 Ant 屬性,以便使該屬性被 Ant 任務使用。你可以直接在 AntBuilder 實例上設置屬性。Ant 屬性也可以從一個你可以修改的 Map 中獲得。您還可以使用 Ant property 任務。下面是一些如何做到這一點的例子。
Example 17.13\. Setting an Ant property
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>
~~~
有幾種方法可以設置 Ant 引用:
Example 17.14\. Getting an Ant property
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']
~~~
有幾種方法可以獲取 Ant 引用:
Example 17.15\. Setting an Ant reference
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"/>
~~~
有幾種方法可以獲取 Ant 引用:
Example 17.16\. Getting an Ant reference
build.xml
~~~
<path id="antPath" location="libs"/>
~~~
``
build.gradle
~~~
println ant.references.antPath
println ant.references['antPath']
~~~
## [](https://github.com/waylau/Gradle-2-User-Guide/blob/master/Chapter%2017.%20Using%20Ant%20from%20Gradle%20%E4%BB%8E%20Gradle%20%E4%BD%BF%E7%94%A8%20Ant.md#174-api)17.4\. API
[AntBuilder](http://gradle.org/docs/current/javadoc/org/gradle/api/AntBuilder.html)?提供 Ant 的集成
- 關于
- 第1章 Introduction 介紹
- 第2章 Overview 總覽
- 第3章 Tutorials 教程
- 第4章 Installing Gradle 安裝
- 第5章 Troubleshooting 問題解決
- 第6章 Build Script Basics 構建腳本的基礎識
- 第7章 Java Quickstart 快速開始 Java
- 第8章 Dependency Management Basics 依賴管理的基礎知識
- 第9章 Groovy Quickstart 快速開始 Groovy
- 第10章 Web Application Quickstart 快速開始 Web 應用
- 第11章 Using the Gradle Command-Line 使用 Gradle 命令行
- 第12章 Using the Gradle Graphical User Interface 使用 Gradle 圖形化用戶界面
- 第13章 Writing Build Scripts 編寫構建腳本
- 第14章 Tutorial - 'This and That' 教程-這個那個
- 第15章 More about Tasks 更多關于任務
- 第16章 Working With Files 跟文件工作
- 第17章 Using Ant from Gradle 從 Gradle 使用 Ant
- 第18章 Logging 日志.md
- 第19章 The Gradle Daemon 守護進程
- 第20章 The Build Environment 構建環境
- 第21章 Gradle Plugins 插件
- 第22章 Standard Gradle plugins 標準 Gradle 插件
- 附錄E Existing IDE Support and how to cope without it 支持的 IDE 以及如何應對沒有它