Gradle的使用教程 -Gradle通過mavenLocal()指向本地倉庫 -Gradle依賴包的存儲(chǔ)位置

文章目錄

Gradle

Gradle項(xiàng)目管理工具

基于Groovy的特定領(lǐng)域語言來聲明項(xiàng)目設(shè)置

Gradle安裝(Windows)

1.下載解壓版

2.配置環(huán)境變量

  1. gradle_home
    • 變量名:GRADLE_HOME
    • 變量值:D:\work\gradle-6.5(gradle安裝目錄)
  2. path(編輯)
    • 變量名:Path(編輯)
    • 變量值:%GRADLE_HOME%\bin(增加)
  3. 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中使用

  1. 創(chuàng)建gradle項(xiàng)目
  2. 創(chuàng)建完成后更改gradle配置(Settings),選擇自己安裝的gradle
  3. 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')` ![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)


閉包(無參數(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"
}` ![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)



閉包(有參數(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}"
}` ![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)


總結(jié)

  1. idea中,使用groovy語言編輯器,Tools - Groovy Console
  2. 方法調(diào)用,省略分號(hào),小括號(hào)
  3. 定義字符串,單引號(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'
}` ![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)


配置使用的倉庫repositories

使用maven本地倉庫

  1. 修改build.gradle文件,配置maven本地倉庫mavenLocal()
`repositories {
    mavenLocal()
}` 

  1. 使用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ì)去下載

參考:https://blog.csdn.net/yzpbright/article/details/89001633?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.nonecase

注意: gradle尋找本地maven倉庫位置的策略

USER_HOME/.m2/settings.xml >> M2_HOME/conf/settings.xml >> USER_HOME/.m2/repository

1、我們一般在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)程倉庫

  1. 修改build.gradle文件,配置maven中央倉庫
`repositories {
    mavenCentral()
}` 


  1. 當(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'
}` ![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)



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"
}` ![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)



Gradle創(chuàng)建多模塊項(xiàng)目

  1. 父模塊有settings.gradle文件,子模塊沒有,settings中配置所擁有的子模塊
`rootProject.name = 'gradle-demo-comment'
include 'model'
include 'core'
include 'web'
include 'admin'` 




  1. 父模塊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 {
}` ![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)



  1. 子模塊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://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)


參考

https://www.bilibili.com/video/BV1iW411C7CV?from=search&seid=4133834168566660009

https://www.bilibili.com/video/BV1J4411C7Q5?from=search&seid=10862907195955895488

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容