gradle能夠完成建構、測試、釋出和其他諸如軟體打包、生成注釋文檔等等功能。
其特點包括:
l 使用簡單
l 支援多方式依賴管理
l 與ant、maven和ivy有良好的相容,支援輕松地從其他建構方式遷移到gradle上
l 支援局部建構
l 支援多工程的建構
l 免費開源
官方網站上面可以下載下傳到各種版本,以及文檔、和論壇等。目前gradle的最新版本為2.0.
gradle的安裝方法很簡單,将解壓後的gradle的bin目錄加到path目錄即可。如下圖所示:
其中,gradle_home目錄為我們解壓gradle下載下傳包的目錄。
為了驗證我們的gradle是否安裝成功。我們可以執行指令gradle–v加以驗證。如下圖所示:
通過eclipse向導建立一個java project工程。工程如下:
建立一個com.sina.landp的package,然後在其下面建立一個helloworld類,代碼如下:
package com.sina.landp;
public class helloworld {
public static void main(string[] args) {
system.out.println("hello world!");
}
}
以上是一個java入門級的類。
再編寫build.gradle在我們的工程目錄下(如上圖所示)。代碼如下:
apply plugin: 'java'
在工程所在的目錄下,打開cmd,運作gradle build指令,并執行。執行結果如下:
通過上面的執行日志,我們可以看到,我們的工程大緻經過了編譯、運作測試案例、建構這幾個大過程。
同時,我們在工程的目錄下,發現新生成了一個build的目錄,目錄内容如下:
根據目錄名稱,我們也能大概猜到裡邊存放的内容。
特别地,我們可以在libs目錄下,找到demo-gradle.jar。
在reports目錄下存放了一個html,我們用浏覽器打開後,其内容如下:
正如其标題所示,該頁面反映了我們的單元測試案例結果。
ok,正如你看到的一樣,gradle建構就這麼簡單。我們這裡僅用了一行代碼,就完成了一個java工程的基本建構。
gradle建構過程,邏輯上都基于兩個基本的概念,projects和tasks。
一個project應該指出最終要生成的内容,例如要生成一個jar、要建構出一個war等等。為了實作最終的目的,我們要通過一個或多個任務來完成。任務即tasks。
一個task可以了解為建構的一個步驟,例如編譯java檔案為class。task是原子操作。task和ant非常相像。
我們現在嘗試一些常用的task,并運作起來看看結果。
剛開始,我們還是來一個hello world。
在我們自己的電腦的檔案目錄上,建立一個build.gradle的檔案,檔案内容為:
task hello{println 'hello world'}
此時通過cmd到該檔案所在的目錄下,此時在cmd上執行指令:
gradle hello
我們可以得到以下結果:
很顯然,我們的任務已經被正确調用并執行。
另外,gradle的task也支援這種寫法:
task hello << {println 'hello world'}
執行結果和上面一樣的。
修改build.gradle,内容改為:
task intro (dependson: hello) <<{println 'intro runs after hello'}
運作gradle intro指令,得到執行結果如下:
task自帶了一些api接口,我們可以申明這些接口要執行的内容,進而插入我們要額外執行的内容。
修改build.gradle檔案内容如下:
task hello << {
println 'hello earth' }
hello.dofirst {
println 'hello venus' }
hello.dolast {
println 'hello mars' }
hello << {
println 'hello jupiter' }
運作指令,得到以下執行結果:
注意dofirst中的内容首先被執行。
通過以上幾個簡單例子,我們對task已經有些認識了。我們現在來看看把這些任務綜合起來完成項目的建構。
也許,我們還記得,在第三章的例子中,我們僅用了一行代碼,即完成了對整個java工程的建構。代碼為:
從其執行的日志,我們可以看到,其實,該行指令帶來的結果是,gradle将一套完整的java建構工程的task全引入到了我們的建構過程中。重點是,這些引入都是正确的。
我們之前有說到,project就是多個task一起組合起來完成建構任務,并生成我們想要的内容。既然gradle幫我們已經引入了很多的task,那就意味着,我們隻需要再添加一些我們需要的task,就可以完成我們自己的項目的建構過程。
确實是這樣的。
接下來,我們做一點更有意義和難度的事情。我們項目裡要用到spring,現在需要搭建一個簡單的spring工程。那麼,第一件事,我們需要做的,就是把spring的jar下載下傳下來。
ok,修改demo-gradle工程的build.gradle檔案内容為:
apply plugin:'java'
repositories {
mavencentral()
dependencies {
compile'org.springframework:spring-context:4.0.5.release'
同樣地,在build.gradle所在目錄下,執行gradlebuild指令。可以說是奇迹發生了吧,得到執行結果如下:
工程不但建構完成,還下載下傳了我們需要的spring的jar包。此時,如果回到eclipse中,發現下載下傳的jar并沒有被引入到工程中。
再在build.gradle中第二行添加一行:
apply plugin: 'eclipse'
之後,執行指令gradle eclipse,得到以下結果:
回到eclipse中,重新整理工程,可以看到我們的jar已經被工程引用了。
最常見的,就是我們要指定編譯生成的jar基于jdk的版本。
修改build.gradle内容為:
sourcecompatibility = 1.6
targetcompatibility = 1.6
compile 'org.springframework:spring-context:4.0.5.release'
以上兩個屬性的作用分别如下:
sourcecompatibility,指定編譯java源代碼的jdk版本;
targetcompatibility,指定生成的class檔案的jdk版本。
添加後執行gradle build指令,也會是成功的。
另外,以上兩個屬性,也是complejava的屬性。也可以寫成:
compilejava {
sourcecompatibility = 1.6
targetcompatibility = 1.6
在build.gradle中添加以下内容:
jar {
manifest {
attributes 'implementation-title':'demo gradle quickstart', 'implementation-version': 1.0
}
執行完gradle build指令後,打開demo-gradle.jar中的manifest檔案,其内容如下所示:
在工程中添加一個單元測試案例。如圖所示:
helloworld.java檔案内容調整為:
package com.sina.landp;
public class helloworld {
publicstatic void main(string[] args) {
system.out.println("helloworld!");
}
publicstring sayhello(string name){
return"hello " + name;
helloworldtest.java檔案内容如下:
import staticorg.junit.assert.assertequals;
import org.junit.before;
import org.junit.test;
public class helloworldtest {
privatehelloworld helloworld;
@before
publicvoid setup(){
helloworld= new helloworld();
@test
publicvoid should_ok_when_call_sayhello_given_a_name() {
stringname = "andy";
stringresp = helloworld.sayhello(name);
stringexpected = "hello andy";
assertequals(expected,resp);
當然,在我們建立”junit test case”時,eclipse就會要求我們添加junit的依賴包。此時,我們的helloworldtest可以正常運作。
為了使得gradle能正常運作,我們需要修改build.gradle檔案内容如下:
dependencies{
testcompile "junit:junit:4.11"
運作gradle build指令,可以看到成功執行。
修改build.gradle檔案,添加内容:
apply plugin: "war"
我們可以通過jetty快速地運作起來我們的工程。對jetty的配置,我們可以指定jetty服務端口号。
jettyrun {
httpport = 9898
另外,和jar類似,可以對war這個task做一些配置。例如,指定哪些jar不用包含在war裡邊。對應的配置如下:
war {
basename = 'depblog'
rootspec.exclude("**/xxx.jar")
最後,我們可以通過gradle jettyrun來運作我們的web項目。