有关其他已翻译的章节请关注Github上的项目:https://github.com/msdx/gradledoc/tree/1.12,或访问:http://gradledoc.qiniudn.com/1.12/userguide/userguide.html

本文原创,转载请注明出处:http://blog.csdn.net/maosidiaoxian/article/details/41204073

关于我对Gradle的翻译,以Github上的项目及http://gradledoc.qiniudn.com 上的文档为准。如有发现翻译有误的地方,将首先在以上两个地方更新。因时间精力问题,博客中发表的译文基本不会同步修改。

第十七章. 从 Gradle 中调用 Ant

Gradle 提供了对 Ant 的优秀集成您可以在你的 Gradle 构建中,使用单独的 Ant 任务或整个 Ant 构建。事实上,你会发现在 Gradle 中使用 Ant 任务比使用 Ant 的XML 格式更容易也更强大。你甚至可以只把 Gradle 当作一个强大的 Ant 任务脚本的工具。

Ant 可以分为两层。第一层是 Ant 的语言。它提供了用于build.xml,处理的目标,特殊的构造方法比如宏,还有其他等等的语法。换句话说,除了
Ant 任务和类型之外全部都有。Gradle 理解这种语言,并允许您直接导入你的Ant build.xml 到
Gradle 项目中。然后你可以使用你的 Ant 构建中的target,就好像它们是 Gradle 任务一样。

Ant 的第二层是其丰富的 Ant 任务和类型,如javaccopyjar。这一层
Gradle 单靠 Groovy 和不可思议的 AntBuilder,对其提供了集成。

最后,由于构建脚本是 Groovy 脚本,所以您始终可以作为一个外部进程来执行 Ant 构建。你的构建脚本可能包含有类似这样的语句:"ant
clean compile".execute()
[8]

你可以把 Gradle 的 Ant 集成当成一个路径,将你的构建从 Ant 迁移至 Gradle 。例如,你可以通过导入您现有的 Ant 构建来开始。然后,可以将您的依赖声明从 Ant 脚本移到您的构建文件。最后,您可以将整个任务移动到您的构建文件,或者把它们替换为一些 Gradle 插件。这个过程可以随着时间一点点完成,并且在这整个过程当中你的 Gradle 构建都可以使用用。

17.1. 在构建中使用
Ant 任务和类型

在构建脚本中,Gradle 提供了一个名为 ant 的属性。它指向一个 AntBuilder实例。AntBuilder 用于从你的构建脚本中访问
Ant 任务、 类型和属性。从 Ant 的 build.xml格式到
Groovy 之间有一个非常简单的映射,下面解释。

通过调用 AntBuilder实例上的一个方法,可以执行一个
Ant 任务。你可以把任务名称当作方法名称使用。例如,你可以通过调用ant.echo()方法执行
Ant 的 echo 任务。Ant
任务的属性会作为 Map 参数传给该方法。下面是执行 echo 任务的例子。请注意我们还可以混合使用
Groovy 代码和 Ant 任务标记。这将会非常强大。

示例 17.1. 使用 Ant 任务

build.gradle

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

gradle
hello
 的输出结果

  1. > gradle hello
  2. :hello
  3. [ant:echo] hello from Ant
  4.  
  5. BUILD SUCCESSFUL
  6.  
  7. Total time: 1 secs

你可以把一个嵌套文本,通过作为任务方法调用的参数,把它传给一个 Ant 任务。在此示例中,我们将把作为嵌套文本的消息传给 echo 任务:

示例 17.2. 向 Ant 任务传入嵌套文本

build.gradle

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

gradle
hello
 的输出结果

  1. > gradle hello
  2. :hello
  3. [ant:echo] hello from Ant
  4.  
  5. BUILD SUCCESSFUL
  6.  
  7. Total time: 1 secs

你可以在一个闭包里把嵌套的元素传给一个 Ant 任务。嵌套元素的定义方式与任务相同,通过调用与我们要定义的元素一样的名字的方法。

示例 17.3. 向 Ant 任务传入嵌套元素

build.gradle

  1. task zip << {
  2. ant.zip(destfile: 'archive.zip') {
  3. fileset(dir: 'src') {
  4. include(name: '**.xml')
  5. exclude(name: '**.java')
  6. }
  7. }
  8. }

您可以用访问任务同样的方法,把类型名字作为方法名称,访问 Ant 类型。方法调用返回 Ant 数据类型,然后可以在构建脚本中直接使用。在以下示例中,我们创建一个 Ant 的 path对象,然后循环访问它的内容。

示例 17.4. 使用 Ant 类型

build.gradle

  1. task list << {
  2. def path = ant.path {
  3. fileset(dir: 'libs', includes: '*.jar')
  4. }
  5. path.list().each {
  6. println it
  7. }
  8. }

有关AntBuilder的详细信息可以参阅
《Groovy in Action》的8.4章节, 或Groovy
维基

17.1.1. 在您的构建中使用自定义
Ant 任务

要使自定义任务在您的构建中可用,你可以使用Ant 任务 taskdef(通常更容易)
typedef,就像在build.xml文件中一样。然后,您可以像引用内置的
Ant 任务一样引用自定义 Ant 任务。

示例 17.5. 使用自定义 Ant 任务

build.gradle

  1. task check << {
  2. ant.taskdef(resource: 'checkstyletask.properties') {
  3. classpath {
  4. fileset(dir: 'libs', includes: '*.jar')
  5. }
  6. }
  7. ant.checkstyle(config: 'checkstyle.xml') {
  8. fileset(dir: 'src')
  9. }
  10. }

你可以使用 Gradle 的依赖管理组合类路径,以用于自定义任务。要做到这一点,你需要定义一个自定义配置的类路径中,然后将一些依赖项添加到配置中。这在50.4章节,“如何声明你的依赖关系”有更详细的描述。

示例 17.6. 声明用于自定义 Ant 任务的类路径

build.gradle

  1. configurations {
  2. pmd
  3. }
  4.  
  5. dependencies {
  6. pmd group: 'pmd', name: 'pmd', version: '4.2.5'
  7. }

若要使用类路径配置,请使用自定义配置里的asPath属性。

示例 17.7. 同时使用自定义 Ant 任务和依赖管理

build.gradle

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

17.2. 导入
Ant 构建

你可以使用ant.importBuild()方法来向
Gradle 项目导入一个 Ant 构建。当您导入一个 Ant 构建时,每个 Ant 目标被视为一个 Gradle 任务。这意味着你可以用与 Gradle 任务完全相机的方式操纵和执行 Ant 目标。

示例 17.8. 导入 Ant 构建

build.gradle

  1. ant.importBuild 'build.xml'

build.xml

  1. <project>
  2. <target name="hello">
  3. <echo>Hello, from Ant</echo>
  4. </target>
  5. </project>

gradle
hello
 的输出结果

  1. > gradle hello
  2. :hello
  3. [ant:echo] Hello, from Ant
  4.  
  5. BUILD SUCCESSFUL
  6.  
  7. Total time: 1 secs

您可以添加一个依赖于 Ant 目标的任务:

示例 17.9. 依赖于 Ant 目标的任务

build.gradle

  1. ant.importBuild 'build.xml'
  2.  
  3. task intro(dependsOn: hello) << {
  4. println 'Hello, from Gradle'
  5. }

gradle
intro
的输出结果

  1. > gradle intro
  2. :hello
  3. [ant:echo] Hello, from Ant
  4. :intro
  5. Hello, from Gradle
  6.  
  7. BUILD SUCCESSFUL
  8.  
  9. Total time: 1 secs

或者,您可以将行为添加到 Ant 目标中:

示例 17.10. 将行为添加到 Ant 目标

build.gradle

  1. ant.importBuild 'build.xml'
  2.  
  3. hello << {
  4. println 'Hello, from Gradle'
  5. }

gradle
hello
 的输出结果

  1. > gradle hello
  2. :hello
  3. [ant:echo] Hello, from Ant
  4. Hello, from Gradle
  5.  
  6. BUILD SUCCESSFUL
  7.  
  8. Total time: 1 secs

它也可以用于一个依赖于 Gradle 任务的 Ant 目标:

示例 17.11. 依赖于 Gradle 任务的 Ant 目标

build.gradle

  1. ant.importBuild 'build.xml'
  2.  
  3. task intro << {
  4. println 'Hello, from Gradle'
  5. }

build.xml

  1. <project>
  2. <target name="hello" depends="intro">
  3. <echo>Hello, from Ant</echo>
  4. </target>
  5. </project>

gradle
hello
 的输出结果

  1. > gradle hello
  2. :intro
  3. Hello, from Gradle
  4. :hello
  5. [ant:echo] Hello, from Ant
  6.  
  7. BUILD SUCCESSFUL
  8.  
  9. Total time: 1 secs

17.3. Ant
属性和引用

有几种方法来设置 Ant 属性,以便使该属性被 Ant 任务使用。你可以直接在AntBuilder实例上设置属性。Ant
属性也可以从一个你可以修改的Map中获得。您还可以使用 Ant property 任务。下面是一些如何做到这一点的例子。

示例 17.12. Ant 属性设置

build.gradle

  1. ant.buildDir = buildDir
  2. ant.properties.buildDir = buildDir
  3. ant.properties['buildDir'] = buildDir
  4. ant.property(name: 'buildDir', location: buildDir)

build.xml

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

许多 Ant 任务在执行时会设置一些属性。有几种方法来获取这些属性值。你可以直接从AntBuilder实例获得属性。Ant
属性也可作为一个 Map。下面是一些例子。

示例 17.13. 获取 Ant 属性

build.xml

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

build.gradle

  1. println ant.antProp
  2. println ant.properties.antProp
  3. println ant.properties['antProp']

有几种方法可以设置 Ant 引用:

示例 17.14. Ant 引用设置

build.gradle

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

build.xml

  1. <path refid="classpath"/>

有几种方法可以获取 Ant 引用:

示例 17.15. 获取 Ant 引用

build.xml

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

build.gradle

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

17.4. API

Ant 集成由AntBuilder提供。


[8] In
Groovy you can execute 字符串表示的命令。要了解更多关于使用 Groovy 执行外部进程的内容,可以看一下《Groovy in Action》的9.3.2章节,或者是 Groovy wiki。

Gradle 1.12 翻译——第十七章. 从 Gradle 中调用 Ant的更多相关文章

  1. Gradle 1.12 翻译——第十三章 编写构建脚本

    有关其它已翻译的章节请关注Github上的项目:https://github.com/msdx/gradledoc/tree/1.12,或訪问:http://gradledoc.qiniudn.com ...

  2. “全栈2019”Java第八十七章:类中嵌套接口的应用场景(拔高题)

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  3. Gradle 1.12用户指南翻译——第二十七章. Ear 插件

    其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Github上的地址: https://g ...

  4. Gradle 1.12 翻译——第十四章. 教程 - 杂七杂八

    有关其它已翻译的章节请关注Github上的项目:https://github.com/msdx/gradledoc/tree/1.12,或訪问:http://gradledoc.qiniudn.com ...

  5. Gradle 1.12翻译——第十九章. Gradle 守护进程

    有关其他已翻译的章节请关注Github上的项目:https://github.com/msdx/gradledoc/tree/1.12,或访问:http://gradledoc.qiniudn.com ...

  6. Gradle 1.12 翻译——第十五章. 任务详述

    有关其他已翻译的章节请关注Github上的项目:https://github.com/msdx/gradledoc/tree/1.12,或访问:http://gradledoc.qiniudn.com ...

  7. Gradle 1.12 翻译——第十二章 使用Gradle 图形用户界面

    有关其他已翻译的章节请关注Github上的项目:https://github.com/msdx/gradledoc/tree/1.12,或访问:http://gradledoc.qiniudn.com ...

  8. Gradle 1.12 翻译——第九章 Groovy高速入口

    由于时间.没办法,做笔记和翻译的同时,大约Gradle用户指南.本博客不再做相关的注意事项.而仅仅翻译和本出版物中未翻译章节. 有关其他章节翻译请注意Github该项目:https://github. ...

  9. Gradle 1.12翻译——第二十章. 构建环境

    有关其他已翻译的章节请关注Github上的项目:https://github.com/msdx/gradledoc/tree/1.12,或访问:http://gradledoc.qiniudn.com ...

随机推荐

  1. 152. Maximum Product Subarray(中等, 神奇的 swap)

    Find the contiguous subarray within an array (containing at least one number) which has the largest ...

  2. 常见常用的CSS

    字体属性:(font) 大小 {font-size: x-large;}(特大) xx-small;(极小) 一般中文用不到,只要用数值就可以,单位:PX.PD 样式 {font-style: obl ...

  3. Web网页树形列表中实现选中父节点则子节点全选和不选中父则子全不选

                需要实现的功能:选中父节点对应子节点全选:不选中父节点,对应子节点也不选中 如下图所示,选中车队,对应车队中车辆也全部选中,以实现车队中所有车辆在地图上的显示. 选中cqupt ...

  4. 手把手教你全家桶之React(一)

    前言 最近项目用到react,其实前年我就开始接触react,时光匆匆,一直没有时间整理下来(太懒啦)!如今再次用到,称工作间隙,对全家桶做一次总结,项目源码地址.废话不多说,上码. 创建一个文件目录 ...

  5. UltraISO安装centos7系统

    1. 使用最新版UltraISO将ISO镜像刻录到U盘一定要是最新版,试用版都可以,按下图操作: 2. U盘启动电脑进入安装界面正常情况下你应该会看到下面的这个界面: 选择第一项,然后按TAB键(在评 ...

  6. JavaScript Boolean(布尔)对象

    Boolean(布尔)对象用于将非布尔值转换为布尔值(true 或者 false). Boolean(布尔)对象是三种包装对象:Number.String和Boolean中最简单的一种,它没有大量的实 ...

  7. 豌豆夹Redis解决方案Codis源码剖析:Proxy代理

    豌豆夹Redis解决方案Codis源码剖析:Proxy代理 1.预备知识 1.1 Codis Codis就不详细说了,摘抄一下GitHub上的一些项目描述: Codis is a proxy base ...

  8. 重温java基础

    Java标识符 Java所有的组成部分都需要名字.类名.变量名以及方法名都被称为标识符. 关于Java标识符,有以下几点需要注意: 所有的标识符都应该以字母(A-Z或者a-z),美元符($).或者下划 ...

  9. 微信小程序发布

    一.操作步骤 (1)打开[微信开发者工具]->新建一个默认项目->点击[项目]->点击[上传] (2)使用微信小程序公众平台管理员扫描二维码,在手机微信上点击[确认上传] (3)输入 ...

  10. Linux 高性能服务器编程——Linux网络编程基础API

    问题聚焦:     这节介绍的不仅是网络编程的几个API     更重要的是,探讨了Linux网络编程基础API与内核中TCP/IP协议族之间的关系.     这节主要介绍三个方面的内容:套接字(so ...