天天看點

Gradle7.4安裝與基本使用

文章目錄

    • 一.前言
    • 二.下載下傳Gradle
    • 三.Gradle鏡像源-全局級配置
    • 四.配置Gradle wrapper-項目級配置
    • 五.Gradle對測試的支援
    • 五.生命周期
      • 5.1 settings檔案
    • 六.Gradle任務入門
      • 6.1 任務行為
      • 6.2 任務依賴方式
    • 七. Dependencies依賴引入
      • 7.1 依賴沖突及解決方案
    • 八.Gradle整合多子產品SpringBoot
    • 九. Gradle整合微服務SpringCloud

一.前言

gradle有突出的版本不相容問題.是以要注意

SpringBoot對Gradle的要求

,以及

IDEA對Gradle的要求

.

在IDEA的plugins/lib/gradle中規定了gradle的最大版本号. 在2022.2.1中是6.7 在2022.3.2中是7.4.

其餘自行檢視該位置的版本控制.不過idea規定的版本号可以更改.

Gradle7.4安裝與基本使用

檢視SpringBoot與Gradle的相容性

二.下載下傳Gradle

Gradle官網位址

Gradle7.4安裝與基本使用
Gradle7.4安裝與基本使用
Gradle7.4安裝與基本使用

下載下傳完整版解壓後

Gradle7.4安裝與基本使用
Gradle7.4安裝與基本使用

系統變量配置Gradle倉庫

鍵必須為GRADLE_USER_HOME

Gradle7.4安裝與基本使用

系統變量配置Gradle全局系統變量 gradle的bin目錄

Gradle7.4安裝與基本使用

驗證 gradle -v

Gradle7.4安裝與基本使用

三.Gradle鏡像源-全局級配置

Gradle使用maven定位鏡像位址參考: 阿裡雲雲效Maven

全局配置 在Gradle的init.d目錄下建立gradle為字尾的檔案.

Gradle7.4安裝與基本使用
allprojects {
    repositories {
        maven { name "Alibaba" ; url "https://maven.aliyun.com/repository/public" }
        maven { name "google" ; url 'https://maven.aliyun.com/repository/google' }
        mavenCentral()
    }

    buildscript { 
        repositories { 
            maven { name "Alibaba" ; url 'https://maven.aliyun.com/repository/public' }
            maven { name "gradle-plugin" ; url 'https://maven.aliyun.com/repository/gradle-plugin' }
            maven { name "spring-plugin" ; url 'https://maven.aliyun.com/repository/spring-plugin' }
            maven { name "M2" ; url 'https://plugins.gradle.org/m2/' }
        }
    }
}
           

四.配置Gradle wrapper-項目級配置

Gradle7.4安裝與基本使用

解決項目在多台電腦開發時,Gradle環境不一緻,idea不相容等問題.

Gradle指令調用本地的gradle腳本.而在項目中應當運作gradlew才是調用項目中的wrapper腳本

Gradle7.4安裝與基本使用
Gradle7.4安裝與基本使用
Gradle7.4安裝與基本使用
Gradle7.4安裝與基本使用
Gradle7.4安裝與基本使用

當執行

gradlew.bat classes
gradlew.bat test
gradlew.bat build
           

等,會下載下傳gradle相關内容

五.Gradle對測試的支援

Gradle7.4安裝與基本使用
test{
	useJUnitPlatform() // 支援對junit5測試
}
           

五.生命周期

Gradle項目的生命周期分為三大階段: Initialization ->Configuration -> Execution.每個階段都有自己的職責,具體如下圖所示:

Gradle7.4安裝與基本使用

Initialization 隻執行一次初始化腳本.

Configuration 先執行加載父腳本,再是子腳本,再是孫子腳本

Gradle7.4安裝與基本使用
Gradle7.4安裝與基本使用

5.1 settings檔案

Gradle7.4安裝與基本使用
Gradle7.4安裝與基本使用
Gradle7.4安裝與基本使用

六.Gradle任務入門

6.1 任務行為

def map = new HashMap<String,Object>();
//action屬性可以設定為閉包,設定task自身的行為
map.put("action",{println "task one.."})

task (map,"task1"){
	// 任務的配置段:在配置階段執行
	println "最先執行"
	// 任務的行為:在執行階段執行,doFirst會在doLast執行之前執行
	doFirst {
		println "task1 doFirst"
	}
	doLast {
		println "task1 doLast"
	}
}

task.doFirst {
		println "task1 doFirst outer"
}

task.doLast {
		println "task1 doLast outer"
}
           
Gradle7.4安裝與基本使用
Gradle7.4安裝與基本使用

6.2 任務依賴方式

Gradle7.4安裝與基本使用
Gradle7.4安裝與基本使用

七. Dependencies依賴引入

Gradle7.4安裝與基本使用
Gradle7.4安裝與基本使用

除非涉及到多子產品依賴,為了避免重複依賴,咱們會使用api,其它情況我們優先選擇implementation,擁有大量的api 依賴項會顯著增加建構時間。

7.1 依賴沖突及解決方案

依賴沖突是指 “在編譯過程中, 如果存在某個依賴的多個版本, 建構系統應該選擇哪個進行建構的問題”,如下所示:

Gradle7.4安裝與基本使用

A、B、C 都是本地子項目 module,log4j 是遠端依賴。

編譯時: B 用 1.4.2 版本的 log4j,C 用 2.2.4 版本的 log4j,B 和 C 之間沒有沖突

打包時: 隻能有一個版本的代碼最終打包進最終的A對應的jar |war包,對于 Gradle 來說這裡就有沖突了

預設下,Gradle 會使用最新版本的 jar 包【考慮到新版本的 jar 包一般都是向下相容的】,實際開發中,還是建議使用官方自帶的這種解決方案。當然除此之外,Gradle 也為我們提供了一系列的解決依賴沖突的方法: exclude 移除一個依賴,不允許依賴傳遞,強制使用某個版本。

● Exclude 排除某個依賴

dependencies {
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.1' testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.1' implementation('org.hibernate:hibernate-core:3.6.3.Final'){
//排除某一個庫(slf4j)依賴:如下三種寫法都行
exclude group: 'org.slf4j' exclude module: 'slf4j-api'
exclude group: 'org.slf4j',module: 'slf4j-api'
}
//排除之後,使用手動的引入即可。implementation 'org.slf4j:slf4j-api:1.4.0'
}
           

● 不允許依賴傳遞 在添加依賴項時,如果設定 transitive 為false,表示關閉依賴傳遞。即内部的所有依賴将不會添加到編譯和運作時的類路徑。

dependencies {
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.1' testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.1' implementation('org.hibernate:hibernate-core:3.6.3.Final'){
//不允許依賴傳遞,一般不用
transitive(false)
}
//排除之後,使用手動的引入即可implementation 'org.slf4j:slf4j-api:1.4.0'
}
           

● 強制使用某個版本

dependencies {
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.1' testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.1' implementation('org.hibernate:hibernate-core:3.6.3.Final')
//強制使用某個版本!!【官方建議使用這種方式】
implementation('org.slf4j:slf4j-api:1.4.0!!')
//這種效果和上面那種一樣,強制指定某個版本implementation('org.slf4j:slf4j-api:1.4.0'){
version{
strictly("1.4.0")
}
}
}
           

八.Gradle整合多子產品SpringBoot

SpringBoot官網整合說明

Gradle7.4安裝與基本使用
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
           
Gradle7.4安裝與基本使用
Gradle7.4安裝與基本使用

子產品聚合./settings.gradle

Gradle7.4安裝與基本使用

建立.gradle字尾的檔案做版本管理

Gradle7.4安裝與基本使用

config.gradle

ext {
    lombokVerison = '1.18.24'
    mybatisPlusVersion = '3.5.2'
    druidVersion = '1.2.8'
    mysqlVersion = '8.0.32'
    commonsVersion = '3.12.0'
}
           

./build.gradle抽取公共配置, 編碼,環境,鏡像源

// 加載建構期需要的插件
buildscript {
    repositories {
        maven { name "Alibaba"; url 'https://maven.aliyun.com/repository/public' }
        maven { name "google"; url 'https://maven.aliyun.com/repository/google' }
        maven { name "gradle-plugin"; url 'https://maven.aliyun.com/repository/gradle-plugin' }
        maven { name "spring-plugin"; url 'https://maven.aliyun.com/repository/spring-plugin' }
        maven { name "M2"; url 'https://plugins.gradle.org/m2/' }
        mavenCentral()
    }
    // 維護插件版本
    dependencies {
        classpath('org.springframework.boot:spring-boot-gradle-plugin:2.6.3')
    }
}
// 導入插件
plugins {
    id 'java-library'
}

group 'com.vector'
version '1.0-SNAPSHOT'

// 讀取gradle版本配置
apply from: 'config.gradle'


// 對所有子子產品做統一管理
subprojects {
    //添加插件 目前Gradle版本不支援在allprojects下聲明plugins,使用的是舊的寫法
    apply plugin: 'java-library'
    apply plugin: 'org.springframework.boot' //維護springboot版本号,不單獨使用,和下面兩個插件一起用
    apply plugin: 'io.spring.dependency-management'// 相當于<dependencyManagement>版本管理
    //基本JDK配置sourceCompatibility = 1.8
    sourceCompatibility = 1.8
    targetCompatibility = 1.8

    compileJava.options.encoding "UTF-8"
    compileTestJava.options.encoding "UTF-8"

    tasks.withType(JavaCompile).configureEach {
        options.encoding = "UTF-8"
    }
    // SpringBoot Plugin生效的非常關鍵的設定
    // 主啟動類位置
    bootJar {
        mainClass.set('org.vector.Main')
    }

    //依賴的配置:設定通用的依賴
    dependencies {
        testImplementation 'org.junit.jupiter:junit-jupiter-api'
        testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine'
        compileOnly group: 'org.projectlombok', name: 'lombok', version: lombokVerison
    }
    test {
        useJUnitPlatform()
    }
}

project("module01") {
    apply plugin: 'java-library'//支援api
    dependencies {
        compileOnly group: 'org.projectlombok', name: 'lombok', version: lombokVerison
    }
}
project("module02") {
    apply plugin: 'java-library'//支援api
    dependencies {
        // implementation不會進行依賴傳遞. api可以進行依賴傳遞
        api project(':module01')
        // mp持久化架構
        implementation group: 'com.baomidou', name: 'mybatis-plus-boot-starter', version: mybatisPlusVersion
        // druid連接配接池
        implementation group: 'com.alibaba', name: 'druid-spring-boot-starter', version: druidVersion
        // mysql資料庫
        implementation group: 'mysql', name: 'mysql-connector-java', version: mysqlVersion
    }
}

project("module03") {
    dependencies {
        // 不需要在繼續依賴傳遞
        implementation project(':module02')
        // spring-boot-starter-web
        implementation 'org.springframework.boot:spring-boot-starter-web'
        //spring-boot-starter-test
        testImplementation 'org.springframework.boot:spring-boot-starter-test'
        // spring-boot-starter-aop
        implementation 'org.springframework.boot:spring-boot-starter-aop'
        //spring-boot-starter-data-redis
        implementation 'org.springframework.boot:spring-boot-starter-data-redis'
        // commons工具類
        implementation group: 'org.apache.commons', name: 'commons-lang3', version: commonsVersion
    }
}

           
Gradle7.4安裝與基本使用

那麼可以自行探尋更優雅的寫法.

九. Gradle整合微服務SpringCloud

項目結構

Gradle7.4安裝與基本使用

建立version.gradle

ext {
    version = [
            "lombokVerison"     : "1.18.24",
            "mybatisPlusVersion": "3.5.2",
            "druidVersion"      : "1.2.8",
            "mysqlVersion"      : "8.0.32",
            "commonsVersion"    : "3.12.0"
    ]

    // 公共依賴
    dependencies = [
            "lombok"      : "org.projectlombok:lombok:${version.lombokVerison}",
            "druid"       : "com.alibaba:druid-spring-boot-starter:${version.druidVersion}",
            "mysql"       : "mysql:mysql-connector-java:${version.mysqlVersion}",
            "common-lang3": "org.apache.commons:commons-lang3:${version.commonsVersion}",
            "mybatisPlus" : "com.baomidou:mybatis-plus-boot-starter:${version.mybatisPlusVersion}"
    ]


}
           

./build.gradle

description '微服務父工程'

//建構Gradle腳本自身需要的資源,可以聲明的資源包括依賴項、第三方插件、maven倉庫位址等。
buildscript {
    ext {
        springBootVersion = '2.6.3'
        springCloudversion = '2021.0.1'
        springCloudAlibabaVersion = '2021.1'
        springBootGradlePlugin = '2.6.3'
    }

    repositories {
        maven { name "Alibaba"; url 'https://maven.aliyun.com/repository/public' }
        maven { name "google"; url 'https://maven.aliyun.com/repository/google' }
        maven { name "gradle-plugin"; url 'https://maven.aliyun.com/repository/gradle-plugin' }
        maven { name "spring-plugin"; url 'https://maven.aliyun.com/repository/spring-plugin' }
        maven { name "M2"; url 'https://plugins.gradle.org/m2/' }
        mavenCentral()
    }
    // 維護插件版本
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootGradlePlugin}")
    }
}

group 'com.vector'
version '1.0-SNAPSHOT'

// 讀取gradle版本配置
apply from: 'version.gradle'

// 對所有子子產品做統一管理
subprojects {
    //添加插件 目前Gradle版本不支援在allprojects下聲明plugins,使用的是舊的寫法
    apply plugin: 'java-library'
    apply plugin: 'org.springframework.boot' //維護springboot版本号,不單獨使用,和下面兩個插件一起用
    apply plugin: 'io.spring.dependency-management'// 相當于<dependencyManagement>版本管理

    // 将配置資訊加載進聲明中.版本控制
    dependencyManagement{
        dependencies {
            for(depJar in rootProject.ext.dependencies){
                dependency depJar.value
            }
        }
        imports {
            // spring-cloud-dependencies
            mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudversion}"
            // spring-cloud-alibaba-dependencies
            mavenBom "com.alibaba.cloud:spring-cloud-alibaba-dependencies:${springCloudAlibabaVersion}"
        }
    }

    //依賴的配置:設定通用的依賴
    dependencies {
        testImplementation 'org.junit.jupiter:junit-jupiter-api'
        testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine'
        // spring-boot-starter
        implementation 'org.springframework.boot:spring-boot-starter'
        // spring-cloud-starter-alibaba-nacos-discovery
        implementation 'com.alibaba.cloud:spring-cloud-starter-alibaba-nacos-discovery'
        // spring-cloud-starter-alibaba-nacos-config
        implementation 'com.alibaba.cloud:spring-cloud-starter-alibaba-nacos-config'
        // spring-cloud-alibaba-sentinel-gateway
        implementation 'com.alibaba.cloud:spring-cloud-alibaba-sentinel-gateway'

    }
    //基本JDK配置sourceCompatibility = 1.8
    sourceCompatibility = 1.8
    targetCompatibility = 1.8

    compileJava.options.encoding "UTF-8"
    compileTestJava.options.encoding "UTF-8"

    tasks.withType(JavaCompile).configureEach {
        options.encoding = "UTF-8"
    }

    test {
        useJUnitPlatform()
    }
}

project("module01") {
    description ("微服務子產品1")
    apply plugin: 'java-library'//支援api
    dependencies {
        //lombok
        api "org.projectlombok:lombok"
        api "mysql:mysql-connector-java"
        api "org.apache.commons:commons-lang3"
    }
}
project("module02") {
    description ("微服務子產品2")
    apply plugin: 'java-library'//支援api
    dependencies {
        // mp持久化架構
        implementation 'com.baomidou:mybatis-plus-boot-starter'
        // druid-spring-boot-starter
        implementation 'com.alibaba:druid-spring-boot-starter'
        // mysql資料庫
        implementation 'mysql:mysql-connector-java'
    }
}

project("module03") {
    description ("微服務子產品3")
    dependencies {
        // spring-boot-starter-web
        implementation 'org.springframework.boot:spring-boot-starter-web'
        //spring-boot-starter-test
        testImplementation 'org.springframework.boot:spring-boot-starter-test'
        // spring-boot-starter-aop
        implementation 'org.springframework.boot:spring-boot-starter-aop'
        //spring-boot-starter-data-redis
        implementation 'org.springframework.boot:spring-boot-starter-data-redis'
        // commons工具類
        implementation 'org.apache.commons:commons-lang3'
    }
}