当前位置:网站首页>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詳解:
- 地址:Gradle學習筆記
工程化之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的區別
边栏推荐
- Hard core observation 545 50 years ago, Apollo 15 made a feather landing experiment on the moon
- mysql拆分字符串作为查询条件的示例代码
- The important data in the computer was accidentally deleted by mistake, which can be quickly retrieved by this method
- Nftscan Developer Platform launches Pro API commercial services
- How much does the mlperf list weigh when AI is named?
- The same job has two sources, and the same link has different database accounts. Why is the database list found in the second link the first account
- Master binary tree in one article
- Let me ask you if there are any documents or cases of flynk SQL generation jobs. I know that flynk cli can create tables and specify items
- Demonstration of the development case of DAPP system for money deposit and interest bearing financial management
- docker启动mysql及-eMYSQL_ROOT_PASSWORD=my-secret-pw问题解决
猜你喜欢
PDF批量拆分、合并、书签提取、书签写入小工具
If the request URL contains jsessionid, the solution
The problem that dockermysql cannot be accessed by the host machine is solved
Detailed explanation of regular expression (regexp) in MySQL
不要再说微服务可以解决一切问题了
DockerMySQL无法被宿主机访问的问题解决
求帮助xampp做sqlilab是一片黑
MySQL implementation of field segmentation from one line to multiple lines of example code
11 preparations for Web3 and Decentralization for traditional enterprises
MySQL实现字段分割一行转多行的示例代码
随机推荐
Gradle知识概括
B 站弹幕 protobuf 协议还原分析
GPT-3当一作自己研究自己,已投稿,在线蹲一个同行评议
B站大佬用我的世界搞出卷積神經網絡,LeCun轉發!爆肝6個月,播放破百萬
Spark Tuning (II): UDF reduces joins and judgments
Station B Big utilise mon monde pour faire un réseau neuronal convolutif, Le Cun Forward! Le foie a explosé pendant 6 mois, et un million de fois.
CRMEB商城系统如何助力营销?
Daily question brushing record (XV)
云原生(三十二) | Kubernetes篇之平台存储系统介绍
js對JSON數組的增删改查
实现多彩线条摆出心形
Experiment 6: installing eve-ng
机器人材料整理中的套-假-大-空话
Devsecops software R & D security practice - release
Can online reload system software be used safely? Test use experience to share with you
Efficient ETL Testing
mysql连接vscode成功了,但是报这个错
传统企业要为 Web3 和去中心化做的 11 个准备
(1)长安链学习笔记-启动长安链
设计一个抢红包系统