文章目錄
- Gradle
Gradle
Gradle項(xiàng)目管理工具
基于Groovy的特定領(lǐng)域語言來聲明項(xiàng)目設(shè)置
Gradle安裝(Windows)
1.下載解壓版
v6.5:https://downloads.gradle-dn.com/distributions/gradle-6.5-bin.zip(用迅雷下載可能會(huì)快些)
2.配置環(huán)境變量
- gradle_home
- 變量名:
GRADLE_HOME - 變量值:
D:\work\gradle-6.5(gradle安裝目錄)
- 變量名:
- path(編輯)
- 變量名:
Path(編輯) - 變量值:
%GRADLE_HOME%\bin(增加)
- 變量名:
- gradle_user_home(在遠(yuǎn)程倉庫下載的jar包保存到該路徑下)
- 變量名:
GRADLE_USER_HOME - 變量值:
D:\work\gradleCK
- 變量名:
3.配置init.gradle
`allprojects {
repositories {
mavenLocal()
maven { name "Alibaba" ; url "https://maven.aliyun.com/repository/public" }
}
buildscript {
repositories {
maven { name "Alibaba" ; url 'https://maven.aliyun.com/repository/public' }
}
}
}`
- 在
gradle安裝目錄\init.d目錄下,創(chuàng)建init.gradle文件,初始化基本配置:配置遠(yuǎn)程倉庫地址(gradle沒有自己的倉庫,使用的是maven的倉庫)
4.驗(yàn)證是否配置成功
cmd輸入命令:gradle -v
Gradle工程目錄
`gradle-demo
|---src
|---|---main
|---|---|---java(放置正式代碼目錄)
|---|---|---resources(放置正式配置文件目錄)
|---|---|---webapp(放置頁面元素)
|---|---test
|---|---|---java(放置單元測(cè)試代碼目錄)
|---|---|---resources(放置測(cè)試配置文件目錄)
|---build.gradle
|---settings.gradle`
Gradle在idea中使用
- 創(chuàng)建gradle項(xiàng)目
- 創(chuàng)建完成后更改gradle配置(Settings),選擇自己安裝的gradle
- groovy語言編輯器,
Tools - Groovy Console
groovy編程語言
輸出
`//介紹groovy編程語言
println("hello groovy"); // idea快捷鍵sout
println("hello groovy") // 可以省略最后的分號(hào)
println "hello groovy" // 可以省略括號(hào)
println 12 + ":" + 24`
斷言 assert
`age = 18
assert age == 19`
* 1
* 2
定義變量
`// groovy 中定義變量
// def 是弱類型,groovy會(huì)自動(dòng)根據(jù)情況來給變量賦予對(duì)應(yīng)的類型
def i = 18;
println i;
// 字符串定義
str1 = 'xiaoming' // 定義普通字符串
str2 = "name:${str1}" //可以引用變量
str3 = '''name:xiaoming
age:18''' //按格式定義字符串
println str1
println str2
println str3
// 定義一個(gè)集合類型
def list = ['a','b']
// 往list中添加元素
list.add("xiaoming")
list << 'c'
// 取出list中第3個(gè)元素
println list.get(2)
// 定義一個(gè)map
def map = ['key1':'value1','key2':'value2']
// 向map中添加鍵值對(duì)
map.key3 = 'value3'
// 打印出key3的值
println map.get('key3')` 
閉包(無參數(shù))
`// groovy 中的閉包
// 什么是閉包?閉包其實(shí)就是一段代碼塊。在gradle中,我們主要是把閉包當(dāng)參數(shù)來使用
// 閉包省略()
//plugins({
// id('java')
//})
//相當(dāng)于
//plugins {
// id 'java'
//}
// 定義一個(gè)閉包
def b1 = {
println "hello b1"
}
// 定義一個(gè)方法,方法里面需要閉包類型的參數(shù)
def method1(Closure closure) {
//closure()
closure.call()
}
// 調(diào)用方法method1
method1(b1)
method1 b1
method1({
println "xiaoming"
})
method1 {
println "xiaoming"
}` 
閉包(有參數(shù))
`//定義一個(gè)閉包,帶參數(shù)
def b2 = {
v ->
println "hello ${v}"
}
// 定義一個(gè)方法,方法里面需要閉包類型的參數(shù)
def method2(Closure closure){
//closure("xiaoma")
closure.call("xiaoma")
}
// 調(diào)用方法method2
method2 b2
method2 {
v ->
println "hello ${v}"
}` 
總結(jié)
- idea中,使用groovy語言編輯器,
Tools - Groovy Console - 方法調(diào)用,省略分號(hào),小括號(hào)
- 定義字符串,單引號(hào)定義普通字符串,雙引號(hào)可以引用變量,三引號(hào)按格式定義字符串
gradle構(gòu)建腳本介紹
gradle構(gòu)建腳本介紹(build.gradle)
兩個(gè)重要的概念 project 和 task
任何一個(gè)Gradle構(gòu)建都由一個(gè)或多個(gè)project組成,每個(gè)project包括許多的構(gòu)建部分
每個(gè)project由一個(gè)或多個(gè)Task組成,每個(gè)Task表示在構(gòu)建執(zhí)行過程中的一個(gè)原子操作
構(gòu)建Project完成后會(huì)生成一個(gè)jar或者war文件,構(gòu)建過程中Gradle基于build.gradle實(shí)例化一個(gè)org.gradle.api.Project對(duì)象,并通過project變量來隱式的調(diào)用其成員變量
Project對(duì)象屬性:project(隱式使用)、group、name、version、path、description、projectDir、buildDir、ant
其它常用配置:plugins(apply plugin)、dependencies、repositories、task、ext(gradle.properties 屬性配置)
Gradle管理jar包
build.gradle文件的基本內(nèi)容
`plugins {
id 'java'
// web工程需要的插件
id 'war'
}
version '1.0-SNAPSHOT'
group 'xin.yangshuai'
sourceCompatibility = 1.8
/*
* 指定所使用的倉庫
*/
repositories {
// Gradle沒有自己的中央倉庫
// 先從本地maven倉庫尋找依賴的jar包,存在則直接使用本地maven倉庫的jar
mavenLocal()
// 本地maven倉庫沒有則從遠(yuǎn)程倉庫下載jar包,并保存到 環(huán)境變量GRADLE_USER_HOME 配置的路徑下
// 設(shè)置maven倉庫阿里鏡像地址
maven { url 'http://maven.aliyun.com/nexus/content/groups/public/' }
// 配置使用Maven的中央倉庫
mavenCentral()
}
/**
* 配置依賴的jar包
*/
dependencies {
testCompile group: 'junit', name: 'junit', version: '4.12'
/* web工程需要的jar包 */
compile group: 'org.springframework', name: 'spring-context', version: '5.0.2.RELEASE'
compile group: 'org.springframework', name: 'spring-web', version: '5.0.2.RELEASE'
compile group: 'org.springframework', name: 'spring-webmvc', version: '5.0.2.RELEASE'
providedCompile group: 'javax.servlet', name: 'javax.servlet-api', version: '3.0.1'
providedCompile group: 'javax.servlet', name: 'jsp-api', version: '2.0'
}` 
配置使用的倉庫repositories
使用maven本地倉庫
- 修改build.gradle文件,配置maven本地倉庫
mavenLocal()
`repositories {
mavenLocal()
}`
- 使用maven本地倉庫,需要告知gradle本地maven倉庫的地址,配置
M2_HOME環(huán)境變量,M2_HOME/conf/settings.xml中指定我們本地倉庫的位置- 變量名:
M2_HOME - 變量值:
D:\work\apache-maven-3.6.3(maven安裝路徑)
- 變量名:
當(dāng)我們使用maven本地倉庫(mavenLocal())時(shí),jar包會(huì)直接利用本地maven倉庫,而不會(huì)去下載
注意: gradle尋找本地maven倉庫位置的策略
USER_HOME/.m2/settings.xml>>M2_HOME/conf/settings.xml>>USER_HOME/.m2/repository1、我們一般在
maven的安裝目錄/conf/settings.xml(也就是我們配置的maven環(huán)境變量)中配置本地倉庫位置,所以我們需要讓gradle選擇該路徑,從而使用我們配置的maven本地倉庫2、gradle先尋找
USER_HOME/.m2/settings.xml,所以我們要?jiǎng)h掉該文件(其實(shí)也可以將安裝目錄下的settings.xml復(fù)制過來)3、maven環(huán)境變量我們習(xí)慣配置成MAVEN_HOME,但是gradle尋找的是M2_HOME,所以我們需要配置M2_HOME環(huán)境變量
參考:https://blog.csdn.net/qq_23085893/article/details/79633934
驗(yàn)證: 切換使用mavenCentral()和mavenLocal(),查看jar包引用地址
使用遠(yuǎn)程倉庫
- 修改build.gradle文件,配置maven中央倉庫
`repositories {
mavenCentral()
}`
-
當(dāng)需要在遠(yuǎn)程倉庫下載jar包時(shí),會(huì)將jar包保存到
GRADLE_USER_HOME\caches\modules-2\files-2.1\文件夾下,配置GRADLE_USER_HOME環(huán)境變量,也可以直接在idea中指定位置變量名:
GRADLE_USER_HOME變量值:
D:\work\gradleCK
其它可用的遠(yuǎn)程倉庫地址
`repositories {
mavenLocal()
// 阿里
maven { url 'http://maven.aliyun.com/nexus/content/groups/public/' }
mavenCentral()
}`
關(guān)于gradle中jar包引用的說明
如果我們?cè)?code>repositories{}中先配置
mavenLocal()(maven本地倉庫),再配置mavenCentral()(遠(yuǎn)程倉庫),那么gradle引用jar的位置就會(huì)出現(xiàn)兩個(gè),如果本地maven倉庫中存在則直接引用本地maven倉庫中的jar包,如果本地maven倉庫中不存在,則會(huì)連接遠(yuǎn)程倉庫地址,將jar包下載到gradle本地緩存地址,并且引用該地址下的jar包。注意: gradle并不會(huì)向本地maven倉庫中下載jar包,gradle緩存路徑下的jar包與maven本地倉庫中的jar包的格式也有區(qū)別。
參考:https://blog.csdn.net/feinifi/article/details/81458639
驗(yàn)證: 查看項(xiàng)目中不同jar包的引用地址(maven倉庫中存在的jar包和不存在的jar包,觀看其引用的地址)
gradle中jar包的依賴配置
jar包依賴方式
`/**
* 配置依賴的jar包
* gradle工程所有的jar包的坐標(biāo)都在dependencies屬性內(nèi)放置
* 每一個(gè)jar包的坐標(biāo)都有三個(gè)基本元素組成 group,name,version
* 添加坐標(biāo)的時(shí)候都要帶上jar包的作用域
*/
dependencies {
testCompile group: 'junit', name: 'junit', version: '4.12'
}`
jar包的依賴范圍(作用域)
jar包的依賴范圍(作用域):
compile:編譯階段:主程序、測(cè)試程序均有效;運(yùn)行階段:均有效
providedCompile:編譯階段:主程序、測(cè)試程序均有效;運(yùn)行階段:均無效(依靠運(yùn)行時(shí)環(huán)境提供的jar包)
runtime:編譯階段:主程序、測(cè)試程序均無效(無需依賴);運(yùn)行階段:均有效
testCompile:編譯階段:主程序無效,測(cè)試程序有效;運(yùn)行階段:均有效
testRuntime:編譯階段:主程序、測(cè)試程序均無效(無需依賴);運(yùn)行階段:測(cè)試程序有效
jar包依賴版本沖突默認(rèn)解決方式
jar包依賴具有傳遞性
依賴jar包版本存在沖突解決方案:
maven:最短路徑原則,先聲明原則
gradle:選擇最高版本
修改jar包依賴的配置策略
`configurations.all {
resolutionStrategy {
// 配置后將不自動(dòng)處理jar包版本沖突,可以與依賴的排除配合使用
failOnVersionConflict()
// 強(qiáng)制使用某個(gè)版本的jar包,覆蓋依照gradle默認(rèn)策略引用的jar包
force 'org.slf4j:slf4j-api:1.7.24'
}
}`
- 直接在build.gradle中配置configurations.all{}
依賴的排除
`dependencies {
compile(group: 'org.hibernate', name: 'hibernate-core', version: '3.6.3.Final') {
// 排除某個(gè)依賴,其中 module 相當(dāng)于 jar包坐標(biāo)中的 name
exclude(group: 'org.slf4j', module: 'slf4j-api')
}
}`
* 1
* 2
* 3
* 4
* 5
* 6
任務(wù)(Task)的編寫
`// 任務(wù)(task)的主要操作動(dòng)作
// dependsOn:依賴相關(guān)操作,定義任務(wù)時(shí)參數(shù)依賴、任務(wù)內(nèi)部依賴、外部添加依賴
// doFirst:任務(wù)執(zhí)行之前執(zhí)行的方法
// doLast(<<(舊功能,不提倡)):任務(wù)執(zhí)行之后執(zhí)行的
task t1 {
doFirst {
println 't1 do first'
}
println 'hello t1'
doLast {
println 't1 do last'
}
}
// 參數(shù)依賴
task t2(dependsOn: 't1') {
// t2執(zhí)行前操作
doFirst {
println 't2 do first'
}
println 'hello t2'
// t2 執(zhí)行后操作
doLast {
println 't2 do last'
}
}
// 結(jié)論:在構(gòu)建Project時(shí),只執(zhí)行直接定義在task下(非doFirst和doLast閉包中)的代碼,有依賴也不會(huì)再次執(zhí)行依賴的task
// 直接調(diào)用task時(shí),只執(zhí)行在doFirst或doLast閉包中的代碼,并且會(huì)優(yōu)先執(zhí)行依賴的task的doFirst或doLast閉包中的代碼
task t3 {
// 任務(wù)內(nèi)部依賴
dependsOn 't1'
println 'hello t3'
doLast {
println 't3 do last'
}
}
task t4 {
doFirst {
println 't4 do first'
}
println 'hello t4'
}
// 外部添加依賴
t4.dependsOn 't1'
//動(dòng)態(tài)任務(wù)
4.times {
val ->
task "task${val}" {
doFirst {
println "The task is task${val}"
}
println "hello task${val}"
}
}
task t5 {
// 給任務(wù)添加自定義屬性
ext.myProperty = 'The property value'
doFirst {
println "t5 ${myProperty}"
}
println 'hello t5'
}` 
Gradle項(xiàng)目構(gòu)建生命周期
Gradle項(xiàng)目構(gòu)建生命周期
初始化階段:通過settings.gradle判斷哪些項(xiàng)目需要初始化,加載所有需要初始化的項(xiàng)目的build.gradle文件并為每個(gè)項(xiàng)目創(chuàng)建project對(duì)象
配置階段:執(zhí)行各項(xiàng)目下的build.gradle腳本,完成project的配置,并且構(gòu)造task任務(wù)關(guān)系圖以便在執(zhí)行階段按照依賴關(guān)系執(zhí)行task中的配置代碼(直接定義在task下的代碼,配置階段就需要執(zhí)行)
執(zhí)行階段:通過配置階段的task圖,按順序執(zhí)行需要執(zhí)行的任務(wù)中的動(dòng)作代碼(任務(wù)調(diào)用才會(huì)執(zhí)行的代碼,定義在doFirst或doLast中的代碼)
Gradle項(xiàng)目構(gòu)建過程中的鉤子方法(我們可以直接覆寫這些方法,在方法中加入我們自己的邏輯)(寫在build.gradle或者settings.gradle中)
`// 項(xiàng)目構(gòu)建之前
gradle.settingsEvaluated {
println "初始化階段0 settingsEvaluated"
}
gradle.projectsLoaded {
println "初始化階段1 projectsLoaded"
}
// 配置階段
gradle.beforeProject {
println "配置階段0 beforeProject"
}
gradle.afterProject {
println "配置階段1 afterProject"
}
gradle.projectsEvaluated {
println "配置階段2 projectsEvaluated"
}
gradle.taskGraph.whenReady {
println "配置階段3 taskGraph.whenReady"
}
// 執(zhí)行階段
gradle.taskGraph.beforeTask {
println "執(zhí)行階段0 taskGraph.beforeTask"
}
gradle.taskGraph.afterTask {
println "執(zhí)行階段1 taskGraph.afterTask"
}
gradle.buildFinished {
println "執(zhí)行階段2 buildFinished"
}` 
Gradle創(chuàng)建多模塊項(xiàng)目
- 父模塊有settings.gradle文件,子模塊沒有,settings中配置所擁有的子模塊
`rootProject.name = 'gradle-demo-comment'
include 'model'
include 'core'
include 'web'
include 'admin'`
- 父模塊build.gradle中配置公用的信息,插件、依賴等
`// 配置統(tǒng)一信息,包括root模塊
allprojects {
// 統(tǒng)一引入 java 插件,并指定版本(注:不能將plugins {id 'java'} 直接挪到 allprojects 里面,變換一下形式)
apply plugin: 'java'
sourceCompatibility = 1.8
// 統(tǒng)一配置公共屬性,例如:group、version
group 'xin.yangshuai'
version '1.0-SNAPSHOT'
}
// 子模塊配置統(tǒng)一信息
subprojects {
// 配置公用的資源庫
repositories {
mavenCentral()
}
// 配置公用的依賴
dependencies {
compile 'ch.qos.logback:logback-classic:1.2.2'
}
}
dependencies {
}` 
- 子模塊build.gradle中配置特有的信息
`apply plugin: 'war'
//如果使用plugins引用插件,則buildscript必須放到plugins前面
buildscript {
repositories {
maven { url 'http://maven.aliyun.com/nexus/content/groups/public/' }
jcenter()
}
dependencies {
classpath 'com.bmuschko:gradle-tomcat-plugin:2.5'
}
}
dependencies {
compile project(':core')
// providedCompile:只在編譯時(shí)依賴,運(yùn)行環(huán)境下不需要
providedCompile 'javax.servlet:javax.servlet-api:3.1.0'
}` 
參考
https://www.bilibili.com/video/BV1iW411C7CV?from=search&seid=4133834168566660009
https://www.bilibili.com/video/BV1J4411C7Q5?from=search&seid=10862907195955895488