Gradle是基於JVM構建工具的新一代版本。它從現有的構建工具如Ant和Maven中學到了不少東西,而且把它們的最優思想提高到更高層次。遵循基於約定的構建方式,Gradle能夠用一種聲明式的方式爲你的問題領域建模,它使用一種強大的且具備表達性的基於Groovy的領域特定語言(DSL),而不是XML,由於Gradle是基於JVM的,它容許你使用本身最喜歡的Java或Groovy語言來編寫定製邏輯。node
爲何應該選擇Gradlespring
Gradle構建腳本是聲明式的,可讀的,而且清晰地表達它們的意圖。用Groovy而不是XML寫代碼,揮灑着Gradle基於約定建構的哲理,大大地下降構建腳本的大小並且更易讀。看到用Gradle實現相同的目標所須要編寫的代碼時確實讓人感到驚訝。使用Gradle時,你不須要作出妥協。而像Maven這樣的構建工具提出的項目佈局就是「要麼個人方式,要麼複雜的方式」,Gradle的DSL提供了靈活性去適應非約定項目佈局。Gradle的座右銘: 「讓不可能成爲可能,讓可能變得簡單,讓簡單變得優雅」。不要改變一個正在運行的系統,你說呢?你的團隊已經花費大量的時間來創建項目構建代碼基礎設施。Gradle並不強迫你徹底遷移全部的構建邏輯。它和其餘構建工具如Ant和Maven有很是好的集成,這是Gradle優先級列表中的最高優先級。市場彷佛注意到Gradle,在Spring2010會議上,Gradle由於最具創新性開源項目被授予Springy大獎(http://www.springsource.org/node/2871 )。注:目前每個Android項目都使用Gradle做爲默認的構建系統。
編程
Gradle引入注目的特性集緩存
可表達性的構建語言和底層的API服務器
在Gradle腳本中每個元素都有一個與Java類一對一的映射。然而,某些元素被Groovy的語法糖衣包裝着。在許多狀況下Groovy化的類相對於Java,代碼更加簡潔,而且容許使用如閉包這樣的新語言特性。閉包
Gradle不可能知足企業級構建的全部需求。經過暴露鉤子(hook)到生命週期階段,Gradle容許監控和配置構建腳本的執行行爲。編程語言
經過暴露用Groovy語言實現的DSL,Gradle爲它的建模創建了一個詞庫。當處理複雜的領域問題時,好比構建軟件,Gradle就成爲一種強有力的工具,能夠用一種通用的語言去表達構建邏輯。讓咱們來看一些例子。最多見的構建就是執行一個工做單元。Gradle將這個工做單元描述成任務(task)。Gradle的標準DSL部分就是可以確切地定義任務,從編譯到打包Java源代碼。這是一種用自身詞彙構建Java項目的語言,且這種語言與其餘環境無關。分佈式
另外一個例子就是你可以表達對外部庫的依賴,這是構建工具須要解決的常見問題。Gradle的開箱即用特性提供了兩個配置塊,容許你定義依賴以及遠程倉庫。若是標準的DSL元素不能知足你的需求,則能夠經過Gradle的擴展機制引入你本身的詞彙。工具
Gradle就是Groovy佈局
Gradle的DSL是由Groovy實現的,它提供了基於Java的語法糖。結果就是產生了一種具備可讀性和表達性的構建語言。全部你寫的腳本都是Groovy。可以用編程語言來表達你須要的構建是Gradle的一大亮點。
靈活的約定
Gradle最主要的思想之一就是針對你的項目給予引導和有意義的默認值。Gradle中的每一個Java項目都確切地知道源代碼和測試類文件的位置,知道如何編譯代碼,運行單元測試,生成Javadoc報告,以及發佈代碼。全部這些任務都徹底集成到了構建生命週期中。若是你堅持使用約定,那麼只須要一點配置。
對於一個Java項目,Gradle已經提供了默認的有意義的任務。例如,你能夠編譯Java源代碼,運行測試和組裝Jar文件。每一個Java項目都以一個標準的目錄佈局開始。它定義了在哪裏能夠找到源代碼,資源文件和測試代碼。能夠經過約定屬性來改變它們的默認值。
Gradle的約定和Maven提供的約定類似,但不會讓你感受到被限制。Ant不會給你任何關於如何組織構建腳本方面的指導,以確保最大程序的靈活性。Gradle則折中選擇,即提供約定,又給予你改變約定的能力。
魯棒和強大的依賴管理
Gradle提供了一個基礎設施去管理解析,獲取和存儲依賴複雜性。一旦它們被下載並存儲到本地緩存中,你的項目就可使用了。企業構建的一個關鍵需求是可重現性,構建在不一樣的機器上產生相同的結果,不受本地緩存內容的影響。像Ivy和Maven這樣的依賴管理器,在它們當前的實現中也不能徹底保證可重現性。爲何?當一個依賴被下載並存儲在本地緩存中時,它還不算是待構建工做的源。在某些狀況下倉庫由於項目而改變,緩存的依賴被認爲是已解析過的,即便工件的內容可能有一點點不一樣。最壞的狀況是,它會致使構建失敗,並且很難調試。對於Ivy另外一個常見問題是依賴的快照版本,處於開發階段的工件,約定的名字是-SNAPSHOT,不會在本地緩存中更新,即使它在倉庫中已經改變和標記爲改變。還有更多的狀況說明當前的解決方案是有缺陷的。Gradle提供了它本身的可配置的,可靠的和有效的依賴管理方案。
大型的企業級項目一般是由多個不一樣功能的模塊組成的。在Gradle的世界裏,每一個子模塊都被看成一個項目,裏面會定義對外部庫或者其餘模塊的依賴。此外,每一個子模塊均可以獨立運行。Gradle幫你找到哪一個子項目的依賴須要從新構建,而不須要將子項目的工件存儲到本地緩存中。
可擴展的構建
對於某些公司,大型的項目可能擁有上百個模塊。構建和測試少許代碼的改變會消耗不少時間。從我的經驗中你可能知道運行清理任務來刪除老的class文件和資源文件就證實了這一點。構建工具不知道找出改變的內容和它們的依賴,這經常讓你很受傷。你須要的工具應該是足夠聰明的,知道只從新構建項目中改變的部分。
Gradle支持經過指定任務的輸入和輸出進行增量性構建。它準確地找出哪些任務須要跳過,哪些須要構建或者部分構建。一樣的思想也應用到多模塊項目中,叫作部分構建。由於你的構建清晰地定義了子模塊之間的依賴關係,Gradle會負責從新構建須要的部分。再也不是默認執行clean任務!
自動化單元測試,集成測試和功能測試是構建過程的一部分。將只須要短期運行的測試和那些須要準備資源和外部依賴的測試分離是有道理的。Gradle支持測試的並行執行。這個特性是徹底可配置的,而且確保你確實正在利用處理器的內核。優勢不止這些。在以後的版本中,Gradle還將支持在多臺機器上執行分佈式測試。
開發人員在開發過程當中會屢次運行構建。那意味着每次都啓動一個新的Gradle進程,載入全部的內部依賴和運行構建邏輯。你會注意到,在實際執行腳本以前會有幾秒鐘的等待時間。要提升啓動的效率,Gradle能夠以守護進程模式運行。實際上,Gradle命令會fork出一個守護進程,它不只會執行你的構建,並且會持續地在後臺運行。後續的構建調用會交給這個守護進程以免啓動時的消耗。這樣,你就會看到一個更快速的初始化構建執行。
輕鬆的可擴展性
大部分企業構建都不同,它們也不會解決相同的問題。一旦完成了創建基本構建腳本的初始化階段,你就會開始實現定製邏輯。Gradle不會對於如何實現代碼給出任何建議。相反,根據你的具體用例,它會提供給你不一樣的選擇。最簡單的實現定製邏輯的方式是實現一個任務。任務能夠直接在構建腳本中定義而不須要特殊的配置。若是你以爲太過複雜,你也許想要找一種能夠在類定義中寫定製化邏輯的方法,這樣可讓維護和編寫代碼更簡單。若是你想要在多個構建或者項目中分享可重用代碼,插件是最好的方式。它是Gradle最強大的擴展機制,插件可讓你徹底訪問Gradle的API,並且能夠像任何其餘軟件同樣,編寫,測試和發佈。寫一個插件很是的簡單,徹底不須要一大堆額外的描述符。
和其餘構建工具集成
若是可以和其餘現有的構建工具集成,難道不是至關節省時間嗎?Gradle與它的前輩Ant,Maven和 Ivy 能夠作很好的集成。若是你是Ant的使用者,Gradle並不強制你徹底遷移構建基礎設施。相反,它容許你導入如今的構建邏輯並重用標準的Ant任務。Gradle構建和Maven及 Ivy 倉庫100%兼容。你能夠從中獲取依賴,也能夠發佈工件。對已有的Maven構建,Gradle提供了一個轉換器能夠將Maven構建邏輯轉換爲Gradle的構建腳本。
現有的Ant腳本能夠無縫地導入到Gradle構建中,並且就像你使用其餘外部Gradle腳本同樣使用它。在運行時,Ant的target直接映射到Gradle的task。Gradle裝載了Ant的類庫並將一個叫做AntBuilder的幫助類暴露到你的腳本中,並且是徹底嵌入到Gradle的DSL中的。它仍然和Ant的XML類似,可是沒有了難看的括號。Ant用戶會感受到賓至如歸,由於他們不須要馬上轉換爲Gradle的語法。從Ant到Gradle的遷移也是不須要太傷腦筋的。你能夠經過重用現有的Ant邏輯,在感覺Gradle特性的同時,小步遷移。
Gradle旨在與Maven集成時可以作到與Ant相同的程度。但目前它尚未作到。長期而言,Maven的POM和插件都會被看做Gradle原生的一部分。Maven和 Ivy倉庫已經成爲今天構建基礎設施的一個重要部分。
錦上添花:額外的特性
難道你不討厭給不一樣的項目安裝新的運行時環境?Gradle包裝器是救星!它容許你在任何須要運行構建的機器上從一個指定的倉庫下載和安裝一個Gradle運行時的新拷貝。這個過程是在第一次構建執行時自動觸發的。包裝器對於給一個發佈團隊分享你的構建或者在持續集成服務器上運行構建是很是有用的。
Gradle也裝載了一個豐富的命令行接口。使用命令行選項,你能夠控制全部的東西,從指定日誌級別,到排除測試,再到顯示幫助信息。這沒有什麼特別的,其餘工具也提供了。只是某些特性比較突出。Gradle容許命令是駝峯形式的縮寫。舉例來講,一個名字是runMyAwesomeTask的命令能夠 rMAT 的縮寫形式調用。很方便,是否是??