使用Gradle引导旧式Ant构建

Gradle提供了几种不同的方式来利用您现有的对Ant的投资,包括积累的知识和您已经放入构建文件中的时间。 这可以极大地方便将Ant生成的项目移植到Gradle的过程,并为您提供逐步进行此操作的路径。 Gradle文档在描述如何在Gradle构建脚本中使用Ant方面做得很好,但是这里有一个快速概述以及我遇到的一些细节。

Gradle AntBuilder

每个Gradle项目都包含一个AntBuilder实例,从而使您的构建文件中可以使用任何和所有Ant功能。 Gradle提供了对现有Groovy AntBuilder的简单扩展,它增加了一种与现有Ant构建文件交互的简单而强大的方法: importBuild(Object antBuildFile)方法。 在内部,此方法利用Ant ProjectHelper解析指定的Ant构建文件,然后将所有目标包装在Gradle任务中,以使它们在Gradle构建中可用。 以下是用于说明的简单Ant构建文件,其中包含一些属性和几个相关的目标。

<?xml version='1.0'?>
<project name='build' default='all'><echo>Building ${ant.file}</echo><property file='build.properties'/><property name='root.dir' location='.'/><target name='dist' description='Build the distribution'><property name='dist.dir' location='dist'/><echo>dist.dir=${dist.dir}, foo=${foo}</echo></target><target name='all' description='Build everything' depends='dist'/>
</project>

使用Gradle导入此构建文件是一种方法。

ant.importBuild('src/main/resources/build.xml')

gradle任务的输出–全部在命令行上显示,目标已添加到构建任务中。

$ gradle tasks --all
...
Other tasks
-----------
all - Build everythingdist - Build the distribution
...

Ant构建文件中使用的属性可以在Gradle构建或命令行中指定,并且与通常的Ant属性行为不同,Ant或命令行上设置的属性可能被Gradle覆盖。 给定一个简单的build.properties文件,其中的foo = bar为单个条目,这里有一些组合来演示覆盖行为。

命令行调用 Gradle构建配置 影响 结果
gradle dist ant.importBuild('src / main / resources / build.xml') 使用从ant build加载的build.properties值 foo = bar
gradle dist -Dfoo = NotBar ant.importBuild('src / main / resources / build.xml') 使用命令行属性 foo = NotBar
gradle dist -Dfoo = NotBar ant.foo ='NotBarFromGradle'
ant.importBuild('src / main / resources / build.xml')
使用Gradle build属性 foo = NotBarFromGradle
gradle dist -Dfoo = NotBar ant.foo ='NotBarFromGradle'
ant.importBuild('src / main / resources / build.xml')
ant.foo ='NotBarFromGradleAgain'
使用Gradle构建属性覆盖 foo = NotBarFromGradleAgain

如何处理任务名称冲突

由于Gradle坚持任务名称的唯一性,因此尝试导入包含与现有Gradle任务名称相同的目标的Ant构建会失败。 我遇到的最常见的冲突是Gradle BasePlugin提供的clean任务。 借助一些间接的帮助,我们仍然可以通过使用GradleBuild任务来导入和使用任何冲突目标,以在独立的Gradle项目中引导Ant构建导入。 让我们在导入的Ant构建中向混合添加一个新任务,并对all任务依赖于蚂蚁清理目标添加另一个依赖。

<!-- excerpt from buildWithClean.xml Ant build file --><target name='clean' description='clean up'><echo>Called clean task in ant build with foo = ${foo}</echo></target><target name='all' description='Build everything' depends='dist,clean'/>

还有一个简单的Gradle构建文件,它将处理导入。

ant.importBuild('src/main/resources/buildWithClean.xml')

最后,在主gradle构建文件中,我们添加了一个任务来运行所需的目标。

task importTaskWithExistingName(type: GradleBuild) { GradleBuild antBuild ->antBuild.buildFile ='buildWithClean.gradle'antBuild.tasks = ['all']
}

这行得通,但不幸的是遇到了一个小问题 。 当Gradle导入这些任务时,它没有正确遵守依赖项的声明顺序。 而是按字母顺序执行从属蚂蚁目标。 在这种特殊情况下,Ant希望在clean之前执行dist目标,而Gradle则以相反的顺序执行它们。 可以通过明确说明任务顺序来解决此问题,该任务顺序绝对不理想,但可行。 这个Gradle任务将按照我们需要的方式执行底层的Ant目标。

task importTasksRunInOrder(type: GradleBuild) { GradleBuild antBuild ->antBuild.buildFile ='buildWithClean.gradle'antBuild.tasks = ['dist', 'clean']
}


其余的Gradle规则

最后,您可以使用Gradle Rule来允许在GradleBuild自举导入中调用任意目标。

tasks.addRule('Pattern: a-<target> will execute a single <target> in the ant build') { String taskName ->if (taskName.startsWith('a-')) {task(taskName, type: GradleBuild) {buildFile = 'buildWithClean.gradle'tasks = [taskName - 'a-']}}
}

在此特定示例中,这还可以使您将调用串联在一起,但要警告它们在完全隔离的环境中执行。

$ gradle a-dist a-clean


源代码

如果您想仔细看一看,本文中引用的所有代码都可以在github上找到。

相关文章:

  1. 为什么我喜欢Gradle?
  2. 一个Groovy / Gradle JSLint插件
  3. 使用Groovy脚本可以做的五件事

参考:在The Kaptain on…内容博客中, 使用Gradle从我们的JCG合作伙伴 Kelly Robinson 引导您的Legacy Ant构建 。


翻译自: https://www.javacodegeeks.com/2012/08/using-gradle-to-bootstrap-your-legacy.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/372038.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

实现chrome扩展启动本地进程 - 补充

实现chrome扩展启动本地进程 - 补充 标签&#xff1a; chrome扩展启动本地程序访问本地磁盘2014-10-17 11:42 6753人阅读 评论(17) 收藏 举报分类&#xff1a;Chrome Plugin版权声明&#xff1a;本文为博主原创文章&#xff0c;未经博主允许不得转载。 示例 主要包含如下部分 c…

SpringMVC整合MongoDB

首先&#xff0c;在pom文件中新增spring-data-mongodb的依赖&#xff1a; <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-mongodb</artifactId> <version>1.8.1.RELEASE</version>&l…

单路电压表c语言编程,用AT89C51单片机制作的数字电压表

此数字电压表&#xff0c;利用A/D转换原理将被测模拟量转换成数字量&#xff0c;并通过控制系统用数字方式显示测量结果。本设计采用AT89C51单片机&#xff0c;ADC0809进行模/数转换&#xff0c;能够测量8路0&#xff5e;5V的输入电压值&#xff0c;可用四位LED数码管轮流或单路…

ZK的实际应用:MVVM –加载和渲染数据

先前的文章简要介绍了RIA框架ZK&#xff0c;以及它CSS Selector启发式控制器机制如何通过使在控制器类中引用UI组件的任务变得相对灵活来减轻UI更改所带来的一些负担。 然后&#xff0c;我们在上一篇文章中探讨了ZK中的MVVM模式如何允许单个ViewModel提供不同的视图。 这篇文章…

搭建一个简单的mybatis框架

一、Mybatis介绍 MyBatis是一个支持普通SQL查询&#xff0c;存储过程和高级映射的优秀持久层框架。MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装。MyBatis可以使用简单的XML或注解用于配置和原始映射&#xff0c;将接口和Java的POJO&#xff08;Pla…

定时操作范例

1 package timetask.demo;2 3 import java.text.SimpleDateFormat;4 import java.util.Date;5 import java.util.Timer;6 import java.util.TimerTask;7 8 /*9 * time类 是一个线程实施&#xff0c;可以用来实现在某一个时间或者某一个时间段后安排某一个任务执行一次或者定期…

c语言空格符 r t,c语言中、\t \r \n 和空格什么意思

具体意思&#xff1a;都是转义字符&#xff0c;空格就是单纯的空格&#xff0c;输入时可以输入空格\t 跳格 \r 回车 \n 换行\\ 反斜杠 \a 警告 \b 退格 \f 换页 \v 垂直跳格 \ddd ddd 是 1、2 或 3 位八进制数字。转义字符串(Escap…

如何在运行时更改日志记录级别

在运行时中更改日志记录级别很重要&#xff0c;这主要在生产环境中非常重要&#xff0c;在生产环境中&#xff0c;您可能希望在有限的时间内进行调试日志记录。 好了&#xff0c;更改根记录器非常简单–假设您有一个具有所需记录级别的输入参数&#xff0c;只需获取根记录器并…

扩展中国剩余定理

转自&#xff1a;http://blog.csdn.net/clove_unique/article/details/54571216 对于两个方程$x\equiv c_1\pmod {m_1}$$x\equiv c_2\pmod {m_2}$将其合并为一个方程&#xff0c;有解条件为$(m1,m2)|(c2-c1)$$m\frac{m1m2}{(m1,m2)}$$c(inv(\frac{m1}{(m1,m2)},\frac{m2}{(m1,m…

易语言添加ctrl c键,易语言操作快捷键汇总

以下是关于易语言的快捷键内容&#xff1a;预览被设计窗口 CtrlEnter运行 F5终止运行 CtrlF5编译 F7菜单编辑器 CtrlE即时帮助 F1在编辑窗口之间跳转。按下 Ctrl 键后不放&#xff0c;然后反复按 Tab 键可以在目前所有的编辑窗口之间跳转&#xff1b;按下 Ctrl 键后同时按下 Ta…

在代理类中引用动态代理

在Stackoverflow中有一个有趣的问题 &#xff0c;关于Spring Bean如何获​​得对由Spring创建的代理的引用以处理事务&#xff0c;Spring AOP&#xff0c;缓存&#xff0c;异步流等。需要对代理的引用&#xff0c;因为如果存在对自身的调用通过代理bean&#xff0c;此调用将完全…

Array的用法总结-swift

Araay是有序的数据集&#xff0c;在OC中分为不可变数组NSArray和可变数组NSMutableArray&#xff0c;在swift中只有常量和变量两种类型&#xff0c;声明成变量那就可以说明是可变的了&#xff01; 学习时的具体的用法总结成如下的代码&#xff1a; //数组var arrInts [Int]()/…

Frame URl

http://www.zi-han.net/theme/hplus/?v4.1 http://webapplayers.com/inspinia_admin-v2.5/ http://baijunyao.com/article/67 转载于:https://www.cnblogs.com/shijiaoyun/p/6065755.html

linux的i o模型,浅谈Linux 网络 I/O 模型简介(图文)

1、介绍Linux 的内核将所有外部设备都看做一个文件来操作(一切皆文件)&#xff0c;对一个文件的读写操作会调用内核提供的系统命令&#xff0c;返回一个file descriptor(fd&#xff0c;文件描述符)。而对一个socket的读写也会有响应的描述符&#xff0c;称为socket fd(socket文…

handsontable 方法汇总

核心方法1.为handsontable添加钩子方法 addHook(key,callback):key为钩子方法名 例如&#xff1a;hot.addHook(beforeInit, myCallback); addHookOnce(key,callback)&#xff1a;添加只使用一次的方法&#xff0c;用完后自动删除 例如&#xff1a;hot.addHookOnce(beforeInit, …

swing中JTable的使用方法

1 public static void main(String[] args) {2 3 Student s1 new Student("张三", "001", 0);4 Student s2 new Student("李四", "002", 1);5 Student s3 new Student("王五", "003",…

android仿高德地图透明黑字,Android 仿高德地图可拉伸的BottomSheet

原标题&#xff1a;Android 仿高德地图可拉伸的BottomSheet2018安卓巴士开发者大会-上海站你一直期待的安卓技术盛宴即将登场&#xff01;前言最近项目中需要用到高德地图搜索结果后的结果展示的可拉伸控件。而我看到这个效果图&#xff0c;觉得这个就是一个slidingpanel&#…

Java EE 7中包含哪些JSR?

我开始填写所有应该加入Java EE 7的Java规范请求的表。 由于平台版本仍在确定中&#xff0c;因此某些细节很难确定。 完整的Java EE 7 EJB产品具有以下标准组件和API&#xff1a; 名称 版 描述 JSR 网页 轮廓 批处理 1.0 批量处理 352 Bean验证 1.1 Bean验证框…

[ Javascript ] JavaScript中的定时器(Timer) 是怎样工作的!

作为入门者来说。了解JavaScript中timer的工作方式是非常重要的。通常它们的表现行为并非那么地直观&#xff0c;而这是由于它们都处在一个单一线程中。让我们先来看一看三个用来创建以及操作timer的函数。var id setTimeout(fn, delay); - 初始化一个单一的timer&#xff0c…

android dropbox anr分析,Android如何分析排查ANR

释放双眼&#xff0c;带上耳机&#xff0c;听听看~&#xff01;在Android开发中&#xff0c;当程序发生异常时会抛出异常信息&#xff0c;先说下三种常见类型&#xff1a;列表内容KeyDispatchTimeout(谷歌default 5s&#xff0c;MTK平台上是8s) –主要类型按键或触摸事件在特定…