当前位置:网站首页>Gradle知識概括

Gradle知識概括

2022-07-06 23:29:00 GeorgeLin98

Gradle簡介

Gradle背景:

  • 早期沒有項目管理工具時,對於項目所依賴的第三方包采用的事:拷貝三方jar包到本地,然後加入到lib目錄下,這樣做劣勢不言而喻,管理複雜容易沖突。
  • Ant:2000年發布,純java編寫
  • Maven:2004年發布,采用pom.xml管理項目
  • Gradle:2012年,google背書的一款項目管理工具

Gradle簡介:

  • Gradle是一種開源自動化構建工具,支持多語言環境,受Ant、Maven思想的影響,集二者之大成,相比Ant的不規範,Maven的配置複雜、生命周期限制較多,Gradle既規範也更靈活,可以使用DSL(領域特定語言,如Groovy)編寫構建,脚本更加精悍。本課程基於Gradle7講解。
  • 優勢:
    ①靈活性:相對於 Maven、Ant 等構建工具,Gradle 提供了一系列的 API 讓我們有能力去修改或定制項目的構建過程。
    ②粒度性:源碼的編譯,資源的編譯,都是一個一個Task的,我們可以修改task來達到精細控制上。
    ③擴展性:Gradle 支持插件機制,所以我們可以複用這些插件,就如同複用庫一樣簡單方便。
    ④兼容性:Gradle 不僅自身功能强大,而且它還能兼容所有的Maven、Ant功能,也就是說,Gradle 吸取了所有構建工具的長處。
    ⑤Spring源碼采用Gradle進行管理
  • 劣勢:
    ①每一個版本都較上一次有非常大的改動,沒有做較好向上兼容。
    ②學習成本高,groovy脚本語言
  • Gradle組成:
    在這裏插入圖片描述

Gradle安裝配置:

  • 地址:官網下載
  • 下載後解壓到本地:
    ①binary-only版本(-bin後綴):只有可執行文件
    ②complete版本(-all後綴):除了可執行文件還包含Gradle的源碼和源碼文檔說明
  • 下載後解壓,配置環境變量:
    ①新建GRADLE_HOME環境變量,將gradle根目錄配置
    ②在path中加入項%GRADLE_HOME%\bin,類似於JDK或Maven的配置
    ③打開CMD,執行gradle -v,成功輸出版本則錶示安裝配置完成
  • 注意:真實工作中由於各項目版本不一,並不會使用本地配置的gradle,而是采用wrapper的方式進行。

Gradle詳解:

  • Gradle中2大對象:Project和Task。
    ①一個構件脚本就是一個project,任何一個Gradle構建都是由一個或多個project組成,大家可以把一個project比作一個pom模塊或一個jar,每一個project都是一個groovy脚本文件。
    ②task顧名思義就是任務,它是Gradle中最小的執行單元,類似於一個method或function函數,如編譯、打包、生成javadoc等,一個project中會有多個tasks。

Gradle構建Web

創建Gradle項目:

  • 手動創建:
    ①執行gradle init創建項目
  • 快速搭建(https://start.spring.io/):
    ①Gradle版的SpringBoot
    ②Maven版的SpringBoot

項目結構解析:

├─build.gradle                        ①
├─gradlew                             ②
├─gradlew.bat						  ③
├─settings.gradle                     ④
├─gradle                              ⑤
│  └─wrapper                          
│      ├─ gradle-wrapper.jar          
│      ├─ gradle-wrapper.properties   
└─src                                 ⑥
    ├─main                            
    └─test
  • 1.項目自動編譯的時候要讀取的配置文件。比如指定項目的依賴包等。build.grade有兩個,一個是全局的,一個是在模塊裏面。全局的build.grade主要設置的是聲明倉庫源,gradle的版本號說明等。
  • 2.linux下的gradle環境脚本,可以執行gradle指令,如:./gradlew build。
  • 3.windows下的gradle環境,可以執行gradle指令。
  • 4.包含必要的一些設置,例如,任務或項目之間的依懶關系等,無論有多少個子模塊,該文件只會有一個,且一定在根項目中。
  • 5.包含wrapper文件夾及其2個子文件,作用是:可以自動安裝gradle環境。
  • 6.程序源碼。

build.gradle基礎結構:

/******** 普通程序 gradle init初始化 ******/
plugins {
    // Apply the java plugin to add support for Java
    id 'java'
    ...
}
repositories {
    // Use jcenter for resolving dependencies.
    // You can declare any Maven/Ivy/file repository here.
    jcenter()
}
dependencies {
    implementation 'com.google.guava:guava:27.1-jre'
    testImplementation 'org.junit.jupiter:junit-jupiter-api:5.4.2'
    testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.4.2'
}
application {
    mainClassName = 'first.init.App'
}
test {
    useJUnitPlatform()
}

/******** SpringBoot 項目基礎配置 ******/
plugins {
	id 'org.springframework.boot' version '2.6.4'
	id 'io.spring.dependency-management' version '1.0.11.RELEASE'
	id 'java'
}

group = 'com.it235'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'

repositories {
	mavenCentral()
}

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-web'
	testImplementation 'org.springframework.boot:spring-boot-starter-test'
}

tasks.named('test') {
	useJUnitPlatform()
}
  • mavenCentral()和jCenter()區別:
    ①mavenCentral:Maven中央倉庫,http://repo1.maven.org/maven2/,由Sonatype公司提供的服務。它是Apache Maven、SBT和其他構建系統的默認倉庫,並能很容易被Apache Ant/Ivy、Gradle和其他工具所使用。開源組織例如Apache軟件基金會、Eclipse基金會、JBoss和很多個人開源項目都將構件發布到中央倉庫。 maven中央倉庫已經將內容瀏覽功能禁掉了,可在http://search.maven.org/查詢構件。
    ②jCenter:是由JFrog公司提供的Bintray中的Java倉庫。它是當前世界上最大的Java和Android開源軟件構件倉庫。 所有內容都通過內容分發網絡(CDN)使用加密https連接獲取。JCenter是Goovy Grape內的默認倉庫,Gradle內建支持(jcenter()倉庫),非常易於在(可能除了Maven之外的)其他構建工具內進行配置。
    JCenter相比mavenCenter構件更多,性能也更好。但還是有些構件僅存在mavenCenter中。

IDE使用Gradle:

  • Settings—》Gradle可以配置gradle_home,但是如果你配置了後續使用會趟不少坑,因為IDEA會默認使用gradle-wrapper的下載內容,這裏我們先講常規配置,如下圖:
    在這裏插入圖片描述
    在這裏插入圖片描述
  • 但當你導入項目時會發現,程序會下載一個wrapper相關的zip包:
    在這裏插入圖片描述
  • 為什麼會這樣呢?跟maven好像不太一樣,這個Wrapper的作用又是什麼?
    ①Gradle-Wrapper是簡化Gardle的安裝和部署,出發點是讓任意的gradle的項目都不需要單獨安裝環境,項目會自動識別有無環境,如果在本地沒有找到與wrapper.properties版本相同的Gardle,IDEA就會幫你下載一個gradle環境,官方的出發點是好的,下面我們來了解下這些配置的意義。
# distributionBase和distributionPath是配合使用,指定gradle解壓後的存放比特置
# GRADLE_USER_HOME錶示用戶目錄,
	# windows系統:c:\window\<user-name>\.gradle\
	# linux是$HOME/.gradle
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists

# 指定某個版本gradle下載地址
distributionUrl=https\://services.gradle.org/distributions/gradle-7.4.1-bin.zip

# zipStoreBase和zipStorePath配合使用,指定下載gradle.zip存放比特置;
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists

Groovy語法基礎

Groovy簡介:

  • Groovy 是一種基於 JVM 的動態語言,他的語法和 Java 相似,最終也是要編譯 .class 在JVM上運行。Groovy完全兼容Java 並且在此基礎上添加了很多動態類型和靈活的特性,比如支持閉包,支持DSL(領域特定語言),是一門非常靈活的動態脚本語言。
  • 要執行groovy的脚本必須要安裝groovy環境,或者使用Java的ClassLoader來調用。
  • 地址:Groovy環境安裝下載鏈接
  • 推薦下載3.0版本,下載後建議放到C盤的C:\Program Files\groovy\目錄下,並配置GROOVY_HOME和Path即可

Groovy詳解:

工程化之Project

Project簡介:

  • 在gradle中,每一個build.gradle文件對應一個Project實例,我們在build.gradle中編寫的內容,就相當於Project實例的屬性或方法。
  • 構建初始化期間,Gradle實例化的步驟如下:
    ①給整個構建創建一個Settings實例,一個Settings實例就是一個settings.gradle文件
    ②針對Settings實例的配置,按配置層次掃描並解析配置在settings.gradle中的project。(其中settings中最為重要的屬性是include)
    ③針對每個project對應的build.gradle進行初始,並創建Project實例(這裏加載project的順序是按照前面的配置層次進行,即廣度掃描加載,這樣可以保證父級模塊加載完後,子模塊才會被加載)
  • 一個完整的project由以下幾個對象組成(實際上只由屬性和方法組成):
    在這裏插入圖片描述

屬性:

  • 內置屬性可以直接賦值,無需聲明:
group = 'com.it235'
version = '1.0.0'
  • 自定義屬性可以使用groovy語法,也可以與java語法結合:
//groovy定義屬性
def pname = "projectName:" + project.name

//java類型接收
String pname = "projectName:" + project.name
  • 使用ext名命空間來擴展屬性,定義後可以在project、task、subproject中讀取和更新:
ext.prop1 = "it"
ext.prop2 = "編程"
  • 屬性作用域:
    ①讀寫屬性時,Project 會按照下面範圍的順序進行查找的,在某個範圍找到屬性後就會返回該屬性。如果沒有找到,會拋出异常。
    <1>Project 對象自身。這個範圍裏的屬性包含 Project 實現類中定義有 getters 和 setters 方法的所有屬性。比如:project.getName() 方法就對應了 name 屬性。至於這些屬性的可讀寫性取决於它們是否定義 getters 或者setters 方法。
    <2>Project 的ext屬性 ( extra ) 。每個 Project 都會維護一個額外屬性的映射,它可以包含任意的名稱 -> 值對。定義後,此作用域的屬性是可讀寫的。比如:project.ext.prop1 = ‘it’ 。
    <3>通過插件被添加到 Project 中的擴展屬性 ( extensions ) 。每個擴展名都可以作為只讀屬性使用,其名稱與擴展名相同。比如:project.android.compileSdkVersion 。
    <4>通過插件添加到 Project 中的約定屬性 ( convention ) 。插件可以通過 Project 的 Convention 對象向 Project 中添加屬性和方法。此範圍的屬性的可讀可寫性取决於約束對象。
    <5>Project 中 Tasks 。可以使用 Task 的名稱作為屬性名稱來訪問task。此範圍的屬性是只讀的。
    <6>ext的屬性和約定屬性從項目的父級繼承,遞歸到根項目。此範圍的屬性是只讀的。
  • 常用的project屬性:
屬性名描述
allprojects包含此項目及其子項目的集合。
buildDir當前項目的編譯目錄(自動生成)默認值 porjectDir/build
defaultTasks當前項目的默認任務的名字集,當前構建沒有提供任務名時會執行這些默認任務
group當前項目的組名
logger當前項目的日志器,可以用來在 build 文件中寫日志
name此項目的名稱
parent此項目的父項目
path這個項目的絕對路徑
project當前project對象實例
rootDir本項目的根目錄。根目錄是根項目的項目目錄
rootProject當前項目層次結構中的根project
subprojects當前項目的子項目的集合
tasks本項目的task集合。
version此項目的版本

方法:

  • 方法作用域:
    ①Project 對象自身
    ②build.gradle 脚本文件
    ③通過插件添加到 Project 中的擴展 ( extensions ) 。每個擴展都可以當做參數是閉包或 Action 的方法。
    ④插件添加到項目中的約定方法 ( convention ) 。插件可以通過項目的 Convention 對象向項目中添加屬性和方法。
    ⑤項目中的 Tasks 。每個 Task 都會添加一個方法,方法名是任務名,參數是單個閉包或者 Action 。該方法使用提供的閉包為相關任務調用 Task.configure( groovy.lang.Closure ) 方法。
  • 常用的Project方法:
方法描述
afterEvaluate可以添加一個閉包,它會在項目完成評估後立即執行。當執行屬於該項目的構建文件時,會通知此類監聽器。
allprojects配置當前項目以及它的每個子項目
apply應用零個或多個插件或脚本。
beforeEvaluate添加一個閉包,它會在項目開始評估前立即執行
configure通過閉包配置對象集合。
copy複制指定的文件
defaultTasks設置此項目的默認任務的名稱。當開始構建時沒有提供任務名稱時使用這些。
delete删除文件和目錄
exec執行外部命令
file解析相對於該項目的項目目錄的文件路徑
findProject按路徑定比特項目。如果路徑是相對的,則相對於該項目進行解釋。
findProperty找特定屬性,如果未找到,則返回給定屬性的值或 null
getAllTasks返回此項目中包含的任務的地圖
hasProperty確定此項目是否具有給定的屬性
javaexec執行 Java 主類
javaexec執行外部 Java 進程。
mkdir創建一個目錄並返回一個指向它的文件。
property返回給定屬性的值。此方法定比特屬性如下:
setProperty設置此項目的屬性。此方法在以下比特置搜索具有給定名稱的屬性,並將該屬性設置在它找到該屬性的第一個比特置。
subprojects配置本項目的子項目
task創建Task具有給定名稱的 a 並將其添加到此項目中
uri將文件路徑解析為 URI,相對於該項目的項目目錄
  • 常用方法示例:
    ①buildscript{}:配置當前gradle脚本自身需要使用的構建信息或依賴
    ②configurations{}:配置使用聲明的依賴項用於特定目的
    ③repositories{}:倉庫配置
    ④dependencies{}:在gradle中dependencies{}是一等公民,它描述了configurations{}中分組依賴的第三方資源。
    ⑤allprojects{}:配置此項目及其每個子項目所需要的依賴。一般在多模塊項目場景下我們會把公共的部分配置在根項目的allprojects中。
    ⑥subprojects{}:子模塊配置
    ⑦sourceSets{}:配置源碼信息
    ⑧artifacts{}:配置需要交付的產品組件信息
    ⑨publishing{}:deploy當前項目到倉庫

工程化之任務

任務簡介:

  • 任務是gradle的最小執行單元,一個build.gradle是由一系列的task組成,重要性不言而喻。

工程化之插件

插件簡介:

  • 插件可以封裝一系列任務,例如 編譯,測試,打包等。IDEA、VsCode、Eclipse、Maven、Chrome等都是支持插件集成的工具。插件意味著擴展,Gradle只要定義好插件規範,各大廠商或個人開發者遵循這個規範就能開發出很多有用的插件,從而豐富Gradle生態。
  • 現如今使用評率非常高的幾款插件:SpringBoot構建插件,Docker容器集成插件,junit單元測試插件等

工程化之生命周期

生命周期:

  • Gradle的核心是一種基於依賴的編程語言,任務與任務之間有一定的依賴關系,並且每個任務只會執行一次。在構建時,Gradle會把這些任務串聯起來形成有向無環圖。那Gradle是在什麼時候進行串聯的呢?這就需要充分了解Gradle在各個階段做了什麼事情了,從一開始到結束的這一連串動作我們稱為生命周期。
  • gradle構建有3個不同的階段:
    ①初始化: gradle支持單項目和多項目構建,在該階段,gradle會解析setting.gradle文件,確定哪些項目需要參與構建,並且為這些項目創建一個Project實例。
    ②配置:當完成初始化階段後,就會進入配置階段,配置階段解析所有project中的build.gradle文件獲取所有的task,形成有向無環圖後執行依賴關系,並且所有project中的build script部分和task的配置段會在這一階段調用(注意並不是執行具體的task代碼)。
    ③執行task: 當完成任務依賴圖後, Gradle 就做好了一切准備,然後進入執行階段。按照有向無環圖中task列錶的順序,執行所有被指定的task。

總結

完整的build.gradle:

apply plugin: 'java'
apply plugin: 'idea'
apply plugin: "war"
//聲明
apply plugin: "com.jfrog.bintray"
apply plugin: 'org.akhikhl.gretty' //gradle + jetty 服務器tomcat

/**
 * buildscript {} 是構建工具Gradle自身所需要的資源,並不是給我們應用所使用,可以聲明maven庫和插件依賴
 * 如:這個區塊裏包含gradle-plugin的依賴,因為這個插件包含了Gradle構建APP模塊所需要的附加命令。 
 */
buildscript {
    /**
     * repositories {} 區域配置Gradle用來下載依賴的倉庫地址。
     * Gradle內置支持的遠程倉庫有JCenter、Maven Central 和 Ivy,4.1版本開始內置支持google()。 
     * 也可以使用本地倉庫或者配置我們自己的遠程倉庫地址。
     * 下面代碼示例Gradle使用JCenter作為查找依賴庫的代碼倉庫。
     */
    repositories {
        maven {url "https://maven.aliyun.com/repository/public"}
        jcenter()
    }

    /**
     * dependencies {} 區域配置了Gradle編譯APP工程所需要的依賴。
     * 下面代碼展示路徑依賴3.1.0版本gradle-plugin
     */
    
	dependencies {
		classpath "com.jfrog.bintray.gradle:gradle-bintray-plugin:1.8.0"
		classpath 'org.akhikhl.gretty:gretty:+'
	}
}

//只允許buildscript 和 pluginManagement在它前面
plugins {
    //核心插件,gradle提供
    id 'java'
    id 'eclipse'
    id 'war'
    //非核心插件(社區插件),必須通過id+version的方式進行約束
    id 'com.bmuschko.docker-remote-api' version '6.7.0'
    id 'com.jfrog.bintray' version '1.8.5'
}

//gav 坐標
group 'com.it235'
version '1.0.0'

sourceCompatibility = 1.8
targetCompatibility = 1.8

/**
 * allprojects {} 區域可以配置工程中所有模塊都用到的代碼倉庫和依賴,如,三方插件或者庫。
 * 如果是一個單體項目可以無需使用allprojects閉包,,直接將repositories寫在根節點下
 */
allprojects {
   repositories {
       maven { url 'https://maven.aliyun.com/repository/jcenter' }
	   maven { url 'https://maven.aliyun.com/repository/google' }
	   maven { url 'https://maven.aliyun.com/repository/central' }
	   maven { url 'https://maven.aliyun.com/repository/gradle-plugin' }
	   google()
	   jcenter()
   }
}

/**
 * subprojects {} 區域可以配置工程中所有子模塊所使用的代碼倉庫和依賴,如,三方插件或者庫。
 * 與allprojects相對應,使用場景較少
 */
subprojects {
   repositories {
       jcenter()
   }
}

test{
	useJUnitPlatform()
}

task cleanx() {
	println "Hello Gradle"
	//Groovy語法,Gradle正真强大的地方,太靈活,所以上手的成本非常高,這也是為什麼別人說比Maven好的地方,Maven XML擴展能力太差了
}

Gradle目錄與Idea配置:

  • Use Gradle from使用此列錶為您的項目配置Gradle版本(配置Gradle工作目錄)。您可以選擇以下選項之一:
    ’gradle-wrapper.properties’ file:這是使用Gradle包裝器的推薦默認選項。在這種情况下,您可以將Gradle版本的更新委派給Gradle並自動下載該版本的Gradle。 此選項還允許您使用精確的Gradle版本進行構建。 Gradle版本保存在項目的gradle目錄中的gradle-wrapper.properties文件中,可幫助您消除任何Gradle版本問題。
    ’wrapper’ task in Gradle build script:選擇此選項可根據包裝器任務配置來配置Gradle包裝器。 如果您希望控制在項目中使用哪個Gradle版本,可能會很方便。如果使用默認的Gradle包裝器選項,然後切換到Gradle包裝器任務配置,則您在任務中所做的更改將在項目導入期間自動更新。
    Specified location:如果您不想使用Gradle包裝器,而是希望手動下載並使用特定的Gradle版本,請選擇此選項。 指定您的Gradle安裝比特置。
  • 配置Gradle用戶家目錄:Gradle默認使用C:\Users\Administrator.gradle作為Gradle倉庫目錄用於存儲全局配置屬性和初始化脚本以及緩存和日志文件。
    ①一般來說不配置在C盤,因此可以在Idea中通過Gradle User Home額外指定配置在其他盤。可以新建一個目錄也可以指定為Maven的本地目錄。
  • 正確配置IDEA使得在Terminal中執行以gradlew(gradle wrapper)開頭命令和操作圖形化的IDEA使用Gradle版本是同一個版本。
    ①GRADLE_USER_HOME指的是你需要配置的環境變量。該環境變量决定了執行 project/gradle/gradle-rapper.jar時下載 project/gradle/gradle-wrapper.properties中指定版本gradle的存放比特置。在命令行中輸入的以gradlew的開頭的命令會使用GRADLE_USER_HOME指定環境變量所在比特置來存放下載的gradle。
    ②Gradle user home指的是IDEA中關於gradle的配置,該配置指是給IDEA使用的,當你在IDEA中點擊gradle相關的圖形按鈕時,譬如gradle構建任務的按鈕或者是Enable-AutoImport按鈕時會使用Gradle user home指定的目錄下載project/gradle/gradle-wrapper.properties指定的gradle版本。
  • 鏈接:IDEA如何正確配置Gradle? GRADLE_USER_HOME 和 Gradle user home的區別
原网站

版权声明
本文为[GeorgeLin98]所创,转载请带上原文链接,感谢
https://yzsam.com/2022/187/202207061550262054.html