一、尋找gradle的歷程

一開始的時候,我們只有一個工程,所有要用到的jar包都放到工程目錄下面,時間長了,工程越來越大,使用到的jar包也越來越多,難以理解jar之間的依賴關系。再后來我們把舊的工程拆分到不同的工程里,靠ide來管理工程之間的依賴關系,各工程下的jar包依賴是雜亂的。一段時間后,我們發現用ide來管理項程很不方便,比如不方便脫離ide自動構建,于是我們寫自己的ant腳本。再后來,維護ant腳本變得痛苦,管理jar包更加痛苦。svn能管理源碼的版本,卻不能管理構建出的部署部件的版本。于是我們決定用maven,然而pom.xml的配置實在太繁了!最后,我找到了神器,gradle!

二、為什么是gradle?

1. groovy 比 xml好用

Gradle用groovy來做為build腳本,比xml要易讀易用得多。用過ant的人都知道,要在ant里面表達一個if分支功能有多么的麻煩,不直觀。由于gradle的build腳本就是groovy程序,所以做分支循環等非常方便自然。

2. Convention over Configuration 比寫大量ant基礎腳本方便

用ant的時候,要得定義哪里放源碼,哪里放jar包,哪里放編譯出的class文件等等,每個項目都要這樣做,非常麻煩。gradle和maven一樣,都定義了一個默認的目錄結構,只要按要這個默認的規則來做,就不需要多寫一行代碼。而且gradle的目錄的結構規范和maven是一樣的。

3. 支付定義task,比maven靈活

maven可以幫助管理依賴關系,但是要在maven里實現一個簡單的自定義功能,就很麻煩,要得寫maven插件,而在gradle里,task是一等公民,可以輕易的添加自己的功能。

4. 靈活的依賴管理

ant沒有依賴管理的功能,都要自己手動做,maven的依賴管理很死板,只能依賴于標準的maven artifact,不能依賴本地的某個jar文件或者其它的源碼。而gradle則可以混合地同時支持這些依賴方法,這樣可以讓舊項目的遷移容易得多。

5. 默認就具有豐富的功能

只要安裝好gradle,默認就支持java項目,war項目,ear項目,做單元測試,生成jar包,上傳jar包到maven服務器,等等功能。一般的項目都已經夠用了。

三、簡單舉例

安裝完gradle之后,在一個目錄里時建一個叫build.gradle的文件,一個工程就配好了。要支持生成jar包的jar工程,只要在build.gradle里面添加一行:

1
apply plugin: 'java'

現在在這個目錄的命令行里運行gradle jar就可以自動完成把/src/main/java下的java文件編譯,自動單元測試/src/test/java下的類,自動生成jar的功能了,太方便了。

讓它依賴于spring,也很簡單:

1
2
3
4
apply plugin: 'java'
dependencies {
    compile 'org.springframework:spring-context:3.0.4.RELEASE'
}

gradle便會自動地到maven服務器下載spring-context-3.0.4.RELEASE.jar,以及它所依賴的jar包。

還可以直接依賴本地jar包,如:

1
2
3
4
apply plugin: 'java'
dependencies {
    compile fileTree(dir: 'libs', include: '*.jar')
}

這樣就可以直接依賴/libs/目錄下所有的jar文件了。

再比如自定義一個task:

1
2
3
4
5
6
apply plugin: 'java'
task myTask << {
    if (System.properties['love']) {
        println "I love you! Gradle!"
    }
}

在命令行執行gradle myTask就會運行這個myTask任務了。

更多功能,要得看http://www.gradle.org 上的官方手冊。