使用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.pswp.cn/news/372038.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/372038.shtml
英文地址,請注明出處:http://en.pswp.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) –主要類型按鍵或觸摸事件在特定…