gradle ant_使用Gradle引导旧式Ant构建

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任务依赖于ant clean目标添加另一个依赖。

<!-- 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

gradle ant

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

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

相关文章

confluence 为合并的单元格新增一行

1&#xff0c;先将最后一个结构取消合并单元格 | | ___ | | | ___ | | _ | ___ | 2&#xff0c;在最后一行追加一行&#xff0c;将左侧合并 3&#xff0c;将上面取消合并的重新合并即可转载于:https://www.cnblogs.com/lavin/p/8866867.html

java怎么把system.out的东西输出到文件上

java怎么把system.out的东西输出到文件上 浏览(1836)|评论(0) 交流分类&#xff1a;Java|笔记分类: 未分类 RT&#xff0c;我们在程序里system.out的东西都是从控制台刷过。 如果你想它写到文件里&#xff0c;以下是一种解决方法&#xff0c;当然你还可以用log4j java代码…

纯Java中的Functor和Monad示例

本文最初是我们使用RxJava进行反应式编程的附录。 但是&#xff0c;尽管与反应式编程非常相关&#xff0c;但对monad的介绍却不太适合。 因此&#xff0c;我决定将其取出并作为博客文章单独发布。 我知道&#xff0c;“ 我自己的&#xff0c;对单子的一半正确和半完全的解释 ”…

[NOI2012]美食节

题解&#xff1a; 很经典的网络流 对于每个厨师拆点分开统计 1倍 2倍 3倍 n&#xff08;mp)^2 有点大 动态加边 即对于每个厨师有了i才会有i1 不过好像还是有点卡常&#xff1f;&#xff1f; 代码&#xff1a; #include <bits/stdc.h> using namespace std; #define INF …

请问:如何实现文件日志功能?要求每天换一个文件。文件名以日期区分

结帖率&#xff1a;100%#1 得分&#xff1a;0 回复于&#xff1a; 2004-06-22 17:24:13 使用一个单独的类封装日志记录&#xff0c;在该类中记录当前使用的文件名&#xff0c;每次记日志时获取一下系统时间&#xff0c;与文件名匹配一下&#xff0c;发现日期不同则新开文件。下…

微信小程序的scroll-view组件

scroll-view为滚动视图&#xff0c;共有水平滚动和垂直滚动两种使用竖向滚动时&#xff0c;需要给<scroll-view/>一个固定高度&#xff0c;通过 WXSS 设置 height。index.wxss 是页面的结构文件&#xff1a;<!--垂直滚动--> <view class"section">…

eclipse使用技巧_有效使用Eclipse的热门技巧

eclipse使用技巧以下是一些技巧&#xff0c;可以帮助您避免潜在的问题并在使用Eclipse时提高工作效率。 避免安装问题 切勿在旧版本之上安装新版本的Eclipse。 首先重命名旧版本&#xff0c;以将其移开&#xff0c;然后将新版本解压缩到干净的目录中。 恢复混乱的工作空间 …

日志文件的编写

/// <summary> /// 写入日志到文本文件 /// </summary> /// <param name"action">动作</param> /// <param name"strMessage">日志内容</param> /// <param name"time">时间</param> pub…

MFC非模态对话框实例

【转载】MFC非模态对话框实例 2012-06-17 16:21:41| 分类&#xff1a; C/MFC | 标签&#xff1a; |字号大中小 订阅 实例目的 在Windows环境中&#xff0c;对话框是一种常用的输入输出手段。对话框有两种类型&#xff0c;非模态和模态。非模态对话框与模态对话框不同&a…

Node简单服务器开发

运用的知识&#xff1a;http&#xff0c;fs&#xff0c;get&#xff0c;post 接口定义&#xff1a;/user?actreg$useraaa&passbbb后台返回格式&#xff1a;{"ok":false,"msg":"原因"}/user?actlogin$useraaa&passbbb后台返回格式&…

5个常见的Hibernate异常及其解决方法

了解如何使用Hibernate轻松解决最常见的问题 Hibernate可能是市场上最受欢迎的JPA实现&#xff0c;您可以在许多地方看到它&#xff0c;例如&#xff1a; 您自己使用过的项目数&#xff0c; 需要Hibernate经验的职位数量&#xff0c;当然还有 互联网上发布的问题和例外数量…

MATLAB figure中提取数据

MATLAB figure中提取数据 (2011-10-26 14:26:21) 转载▼标签&#xff1a; 杂谈 分类&#xff1a; matlab figure画出来&#xff0c;提取数据有很多好处&#xff0c;方便保存&#xff0c;计算&#xff0c;加工&#xff0c;还可以导入到origin里面画图。具体的方法就是两部。第一…

Wine下完美安装QQ 2010:

Wine下完美安装QQ 2010&#xff1a;1、先安装Wine&#xff1a;sudo apt-get install wine2、获取获取最新的WineTricks&#xff0c;WineTricks 是 Wine的其中一个开发者DanKegel写的一个安装Windows有关库和软件的小程序&#xff0c;非常有用。下载WineTricks&#xff0c;在终端…

stopwatch_在Java中衡量执行时间– Spring StopWatch示例

stopwatch有两种方法可以通过使用System.currentTimeinMillis&#xff08;&#xff09;或使用System.nanoTime&#xff08;&#xff09; 来测量Java中经过的执行时间 。 这两个方法可用于测量 Java中两个方法调用或事件之间的经过时间或执行时间 。 计算经过的时间是Java程序员…

oracle客户端中文乱码问题的解决

1 查看服务器端编码 select userenv(language) from dual; 我实际查看到的结果为&#xff1a; USERENV(LANGUAGE) ----------------------------- AMERICAN_AMERICA.ZHS16GBK 2 执行语句 select * from V$NLS_PARAMETERS; 查看第一行PARAMETER项中为NLS_LANGUAGE对应的VALUE项…

avi文件格式详解

avi文件格式详解 AVI是音频视频交错(Audio Video Interleaved)的英文缩写&#xff0c;它是Microsoft公司开发的一种符合RIFF文件规范的数字音频与视频文件格式&#xff0c;原先用于Microsoft Video for Windows (简称VFW)环境&#xff0c;现在已被Windows 95/98、OS/2等多数操作…

许多参数和丢失的信息

代码越少越好&#xff1f; 对象越少越好&#xff1f; 是真的吗 像往常一样&#xff0c;这取决于。 在某些情况下&#xff0c;通过添加更多内容&#xff0c;我们会添加不必要的复杂性。 当我们仅出于“将来可能需要这种额外的灵活性”而创建接口或其他抽象时&#xff0c;就会发…

并发编程---线程queue---进程池线程池---异部调用(回调机制)

线程 队列&#xff1a;先进先出堆栈&#xff1a;后进先出优先级&#xff1a;数字越小优先级越大&#xff0c;越先输出import queueq queue.Queue(3) # 先进先出-->队列q.put(first) q.put(2) # q.put(third) # q.put(4) #由于没有人取走&#xff0c;就会卡主 q.put(4,block…

avi编码格式以及查看的视频编码方式的小工具

avi编码格式以及查看的视频编码方式的小工具 2009-06-06 17:55:47| 分类&#xff1a; 默认分类 | 标签&#xff1a; |字号大中小 订阅 首先要说明的是&#xff0c;文件后缀名为avi的文件不一定使用的编码方式就是一样的&#xff0c;所以才写下来&#xff0c;以备以后查阅…

SQL Server遗失管理权限账号密码怎么办?

假如一个SQL Server实例只允许“SQL身份认证”模式登录数据库&#xff0c;而糟糕的是你忘记了sa的密码&#xff08;sa出于安全考虑应该被禁用&#xff0c;这里仅仅为了描述问题&#xff09;或其它具有sysadmin角色的登录名的密码&#xff1f;个人就遇到这样一个案例&#xff0c…