Windows下安裝Gradle
Gradle官方的安裝文檔,地址如下:
1.Gradle是基於JVM的,所以首先需要確保已經安裝好了JDK,而我這裏是已經安裝好的了,官方文檔中表示目前最新版本的Gradle需要的JDK環境是1.7以上。我這裏用的是jdk10:
2.到官網上下載Gradle,下載地址如下,我這裏下載的是二進制安裝包:
3.下載好後,解壓後目錄如下:
- bin目錄存放可執行文件
- init.d目錄可以存放構建腳本
- lib目錄存放一些庫文件
- media目錄存放的是一些圖標文件
4.配置環境變量:
在path中增加這個環境變量:
5.執行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查看版本命令,確認安裝成功:
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可以簡寫爲 <<
項目和任務的關係圖:
groovy與java比較
本小節我們用一個簡單的demo項目,來直觀的演示一下Java和groovy在語法上的區別。首先創建一個Gradle工程:
自定義GroupId和ArtifactId:
選擇本地的Gradle:
項目創建好後,打開Gradle控制檯:
我們先來使用Java語法進行編寫,代碼及運行結果如下:
如果使用groovy語法進行編寫的話,將會簡單很多。代碼及運行結果如下:
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進入控制檯,點擊jar進行打包:
生成的jar包會存放在build目錄下:
同樣的,我們可以使用Gradle將項目打包爲war包,只需要在構建腳本中,增加打war包的插件即可:
plugins {
id 'java'
id 'war'
}
這時Gradle的控制檯,就會多出一個war插件,點擊這個war,即可將項目打成war包:
生成的war包也是會存放在build目錄下:
自定義任務
我們可以在構建腳本中自定義一些任務,例如我的工程裏沒有自動創建目錄的話,就可以編寫自定義任務讓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目錄下是沒有任何目錄的:
點擊執行makeWebDir任務:
目錄創建成功:
構建的生命週期
Gradle構建的生命週期分爲三個階段:
- 初始化階段:主要初始化項目,有哪些項目需要參於構建
- 配置階段:主要生成Task的依賴關係和執行圖
- 執行階段:執行Task的動作代碼
依賴管理
大部分時候,我們使用構建工具都是使用其中的依賴管理功能。依賴管理概述:
幾乎所有基於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特性之一是自動化依賴管理,通過下圖,我們可以簡單的看到自動化依賴管理過的程:
我們來看看如何添加依賴,例如我現在需要添加logback的依賴,首先到maven中央倉庫上,複製logback的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和Maven一樣,能夠自動進行測試用例的發現,測試發現規則如下:
- 任何繼承自junit.framework.TestCase或groovy.util.GroovyTestCase的類
- 任何被@RunWith註解的類
- 任何至少包含一個被@Test註解的類
由於Gradle和Maven的測試很類似,我這裏就不進行演示了