Gradle初體驗

Windows下安裝Gradle

Gradle官方的安裝文檔,地址如下:

https://gradle.org/install/

1.Gradle是基於JVM的,所以首先需要確保已經安裝好了JDK,而我這裏是已經安裝好的了,官方文檔中表示目前最新版本的Gradle需要的JDK環境是1.7以上。我這裏用的是jdk10:
Gradle初體驗

2.到官網上下載Gradle,下載地址如下,我這裏下載的是二進制安裝包:

https://gradle.org/next-steps/?version=4.10&format=bin

3.下載好後,解壓後目錄如下:
Gradle初體驗

  • bin目錄存放可執行文件
  • init.d目錄可以存放構建腳本
  • lib目錄存放一些庫文件
  • media目錄存放的是一些圖標文件

4.配置環境變量:
Gradle初體驗

在path中增加這個環境變量:
Gradle初體驗

5.執行gradle查看版本命令,確認安裝成功:
Gradle初體驗


CentOS7下安裝Gradle

1.同樣的,需要確認安裝好了JDK環境,我這裏CentOS下使用的JDK版本是1.8:

[root@01server ~]# java -version
java version "1.8.0_171"
Java(TM) SE Runtime Environment (build 1.8.0_171-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.171-b11, mixed mode)
[root@01server ~]# 

2.到官網上獲取下載鏈接,然後下載並解壓Gradle,過程如下:

[root@01server ~]# cd /usr/local/src/
[root@01server /usr/local/src]# wget https://downloads.gradle.org/distributions/gradle-4.10-bin.zip
[root@01server /usr/local/src]# unzip gradle-4.10-bin.zip # 解壓
[root@01server /usr/local/src]# mv gradle-4.10 /usr/local/gradle  # 我這裏習慣放到/usr/local下

3.配置環境變量:

[root@01server ~]# vim /etc/profile  # 在文件末尾添加如下內容
export GRADLE_HOME=/usr/local/gradle
export PATH=$PATH:$GRADLE_HOME/bin
[root@01server ~]# source /etc/profile  # 使配置生效
[root@01server ~]#

4.執行gradle查看版本命令,確認安裝成功:
Gradle初體驗


groovy理論介紹

Groovy簡介:

Groovy是用於Java虛擬機的一種敏捷的動態語言,它是一種成熟的面向對象編程語言,即可以用於面向對象編程,又可以用作純粹的腳本語言。使用該語言不必編寫過多的代碼,同時又具有閉包和動態語言中的其他特性。

Groovy特點:

  • Groovy完全兼容Java的語法
  • 分號是可選的
  • 類、方法默認是public的
  • 編譯器給屬性自動添加getter/setter方法
  • 屬性可以直接用點號獲取
  • 最後一個表達式的值會被作爲返回值
  • == 等同於Java的equals(),並且不會有空指針異常

Groovy特性的高級特性:

  • 支持assert語句
  • 支持可選類型定義
  • 可選的括號
  • 支持三種字符串
  • 擁有集合API
  • 支持閉包

構建腳本介紹

什麼是構建塊:

Gradle構建中的兩個基本概念是項目(project)和任務(task),每個構建至少包含一個項目,項目中包含一個或多個任務。在多項目構建中,一個項目可以依賴於其他項目;類似的,任務可以形成一個依賴關係圖來確保他們的執行順序

什麼是項目(project):

一個項目代表一個正在構建的組件(比如一個jar文件),當構建啓動後,Gradle會基於build.gradle實例化一個org.gradle.api.Project類,並且能夠通過project變量使其隱式可用。項目(project)主要的三個屬性分別是group、name、version,就好比於maven中的groupId、artifactId、version,是作爲組件的座標存在的

項目(project)比較重要的方法分別是plugins、repositories、dependencies、task,plugins用於添加插件,dependencies用於依賴管理,repositories用於指定倉庫,task用於聲明項目中的任務

什麼是任務(task):

任務(task)對應org.gradle.api.Task,主要包括任務動作和任務依賴。任務動作定義了一個最小的工作單元,可以定義依賴於其他任務、動作序列和執行條件

任務(task)比較重要的方法分別是dependsOn、doFirst、doLast ,dependsOn用於聲明任務依賴,任務也是一個動作列表,而doFirst用於在任務列表最前面添加一個動作,doLast則是用於在任務列表末尾添加一個動作,其中doLast可以簡寫爲 <<

項目和任務的關係圖:
Gradle初體驗


groovy與java比較

本小節我們用一個簡單的demo項目,來直觀的演示一下Java和groovy在語法上的區別。首先創建一個Gradle工程:
Gradle初體驗

自定義GroupId和ArtifactId:
Gradle初體驗

選擇本地的Gradle:
Gradle初體驗

項目創建好後,打開Gradle控制檯:
Gradle初體驗

我們先來使用Java語法進行編寫,代碼及運行結果如下:
Gradle初體驗

如果使用groovy語法進行編寫的話,將會簡單很多。代碼及運行結果如下:
Gradle初體驗

groovy中常用的高級特性寫法示例:

// 1.可選類型定義
def version = 1

// 2.assert語句
assert version == 1

// 3.括號是可選的
println(version)
println version

// 4.字符串
// 單引號是純粹的字符串
def s1 = 'demo'
// 雙引號的字符串可以插入變量
def s2 = "current version is ${version}"
// 多行字符串
def s3 = '''this
is a
demo'''

// 5.集合API
// 默認的類型是ArrayList
def list = ['a', 'b', 'c']
// list添加元素
list << 'd'

// 默認的類型是LinkedHashMap
def map = ['ant': 2000, 'maven': 2004]
// map添加元素
map.gradle = 2009

// 6.閉包
// 定義有參數的閉包
def c1 = {
    v ->
        println v
}
// 定義無參數的閉包
def c2 = {
    println 'hello'
}
// 定義使用閉包的方法
def method1(Closure closure) {
    closure('param')
}

def method2(Closure closure) {
    closure()
}

//調用使用閉包的方法,並將閉包對象傳遞進去
method1(c1)
method2(c2)

我們利用以上所提到的高級特性語法來寫一個簡單的構建腳本,代碼如下:

// 在構建腳本中,默認都是有個Project實例的

// plugins 是Project裏的方法
plugins {
    id 'java'
}

// version是Project裏的屬性
version = '0.1'

// repositories是Project裏的方法,用於倉庫管理,這裏使用了有參數的閉包進行調用
repositories {
    mavenCentral()
}

// dependencies是Project裏的方法,用於依賴管理,這裏同樣使用了有參數的閉包進行調用
dependencies {
    compile 'commons-codec:commons-codec:1.6'
}

以上的代碼是一個比較常見的構建腳本,但是寫習慣Java語言的話,可能看不太懂,因爲都忽略了括號。若不忽略括號,則代碼如下:

plugins({
    id 'java'
})

version = '0.1'

repositories({
    mavenCentral()
})

dependencies({
    compile 'commons-codec:commons-codec:1.6'
})

如果能夠完全看懂以上的代碼,就代表已經掌握了groovy的基本語法了。


使用Gradle將項目打包

本小節我們來使用Gradle將項目打包爲jar包,首先按上一小節所演示的,新建一個Gradle項目,默認IDEA會幫我們生成構建腳本,即項目根目錄下的build.gradle文件,然後隨便在工程裏創建個類寫些代碼。如下:
Gradle初體驗

點擊右邊的Gradle進入控制檯,點擊jar進行打包:
Gradle初體驗

生成的jar包會存放在build目錄下:
Gradle初體驗


同樣的,我們可以使用Gradle將項目打包爲war包,只需要在構建腳本中,增加打war包的插件即可:

plugins {
    id 'java'
    id 'war'
}

這時Gradle的控制檯,就會多出一個war插件,點擊這個war,即可將項目打成war包:
Gradle初體驗

生成的war包也是會存放在build目錄下:
Gradle初體驗


自定義任務

我們可以在構建腳本中自定義一些任務,例如我的工程裏沒有自動創建目錄的話,就可以編寫自定義任務讓Gradle幫你創建目錄。在build.gradle構建腳本中,編寫如下內容:

// 定義一個閉包,用於完成目錄的創建
def createDir = {
    path ->
        File dir = new File(path)
        if (!dir.exists()) {
            dir.mkdirs()
        }
}

// 定義makeJavaDir任務
task makeJavaDir() {
    def paths = ['src/main/java', 'src/main/resources', 'src/test/java', 'src/test/resources']
    // 在任務列表最前面添加動作
    doFirst {
        paths.forEach(createDir)
    }
}

// 定義makeWebDir任務
task makeWebDir() {
    // 依賴makeJavaDir任務
    dependsOn 'makeJavaDir'
    def paths = ['src/main/webapp', 'src/test/webapp']
    // 在任務列表末尾添加動作
    doLast {
        paths.forEach(createDir)
    }
}

此時,我的工程的src目錄下是沒有任何目錄的:
Gradle初體驗

點擊執行makeWebDir任務:
Gradle初體驗

目錄創建成功:
Gradle初體驗


構建的生命週期

Gradle構建的生命週期分爲三個階段:

  • 初始化階段:主要初始化項目,有哪些項目需要參於構建
  • 配置階段:主要生成Task的依賴關係和執行圖
  • 執行階段:執行Task的動作代碼

Gradle初體驗


依賴管理

大部分時候,我們使用構建工具都是使用其中的依賴管理功能。依賴管理概述:

幾乎所有基於JVM的軟件項目都需要依賴外部類庫來重用現有的功能。自動化的依賴管理可以明確依賴的版本,可以解決因傳遞性依賴帶來的版本衝突。一個jar包屬於一個工件,在gradle中,工件在倉庫的座標是group、name以及version。而工件存放在倉庫裏,在gradle中常用的倉庫有mavenLocal、mavenCentral、jcenter,其中mavenCentra和jcenter是中央倉庫,mavenLocal則是本地倉庫

關於依賴的傳遞性:

  • B依賴A,如果C依賴B,那麼C依賴A

關於依賴階段:

  • 依賴階段分爲兩個階段,即編譯階段和運行階段,而測試時也是分爲這兩個階段。編譯階段所依賴的jar包,在運行階段也會依賴。不同的階段會有不同的標識,如下:
    • compile:編譯階段,runtime:運行階段
    • testCompile:測試編譯階段,testRuntime:測試運行階段

每個依賴階段的關係圖:
Gradle初體驗

gradle特性之一是自動化依賴管理,通過下圖,我們可以簡單的看到自動化依賴管理過的程:
Gradle初體驗


我們來看看如何添加依賴,例如我現在需要添加logback的依賴,首先到maven中央倉庫上,複製logback的gradle依賴:
Gradle初體驗

然後粘貼到 dependencies 方法裏就完成了依賴的添加,如下:

dependencies {
    testCompile group: 'junit', name: 'junit', version: '4.12'
    // https://mvnrepository.com/artifact/ch.qos.logback/logback-classic
    compile group: 'ch.qos.logback', name: 'logback-classic', version: '1.2.3'
}

注:如果發生依賴版本衝突,gradle默認可以解決版本衝突的問題,當出現兩個不同版本的依賴時,gradle默認會使用最高版本那個

如果我們需要到多個倉庫上查找依賴的時候,可以在 repositories 方法裏添加倉庫,gradle會按照配置先後去倉庫裏查找jar包,如下:

repositories {
    // 會按先後順序去查找jar包
    mavenLocal()
    mavenCentral()
}

如果有私服倉庫的話,也是在 repositories 方法裏進行配置,只不過需要指定一下url地址,如下:

repositories {
    // 一般會把私服倉庫配置在最前面
    maven{
        url ''
    }
    mavenLocal()
    mavenCentral()
}

自動化測試

概述:

一些開源的測試框架比如Junit、TestNG能夠幫助你編寫可複用的結構化的測試用例,爲了運行這些測試用例,你要編譯他們,就像編譯源代碼一樣。測試代碼的作用僅僅用於測試的情況,不應該被髮布到生產環境中,需要把源代碼和測試代碼分開來

Gradle測試目錄結構:
Gradle初體驗

Gradle和Maven一樣,能夠自動進行測試用例的發現,測試發現規則如下:

  • 任何繼承自junit.framework.TestCase或groovy.util.GroovyTestCase的類
  • 任何被@RunWith註解的類
  • 任何至少包含一個被@Test註解的類

由於Gradle和Maven的測試很類似,我這裏就不進行演示了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章