Gradle-學習

本來沒有想了解Gradle,但是在想看SpringBoot源碼的時候發現,在SpringBoot2.2.8版本之后,不再使用maven進行構建,而是使用Gradle。想著把SpringBoot源碼導入idea學習下源碼,但是來來回回折騰了好幾回,都是報錯,想著不如學習下Gradle。

Gradle的官方介紹:

Gradle 是一種廣泛使用且成熟的工具,擁有活躍的社區和強大的開發人員生態系統。

  • Gradle 是 JVM 最常用的構建系統,也是 Android 和 Kotlin 多平臺項目的默認系統。 它擁有豐富的社區插件生態系統。
  • Gradle 可以使用其內置功能、第三方插件或自定義構建邏輯來自動化各種軟件構建場景。
  • Gradle 提供了一種高級、聲明性且富有表現力的構建語言,使您可以輕松讀取和編寫構建邏輯。
  • Gradle 速度快、可擴展,可以構建任何規模和復雜程度的項目。
  • Gradle 可產生可靠的結果,同時受益于增量構建、構建緩存和并行執行等優化。

我簡單的認知:可以用來管理項目需要的依賴,構建項目。

基本概念

Projects(項目):

就是整個項目工程,可以包含多個模塊或者單模塊的一個項目工程。

Build Scripts(構建腳本):

是一個腳本文件,寫一些代碼來規定如何構建項目。

Dependency Management(依賴關系管理):

管理項目結構和jar包的。

Tasks(任務):

任務是gradle的基本工作單元,在構建腳本中可以包含任意個工作單元,類似于一個java類中的方法,可以隨意創建和定義,構建項目也像是一個個任務的執行。

Plugins(插件):

類似于java中的引包,引入插件,就可以在腳本中使用這個插件提供的方法。

Gradle項目結構

project

├── gradle 1??

│ ├── libs.versions.toml 2??

│ └── wrapper 3??

│ ├── gradle-wrapper.jar 4??

│ └── gradle-wrapper.properties 5??

├── gradlew

├── gradlew.bat

├── settings.gradle(.kts) 6??

├── subproject-a

│ ├── build.gradle(.kts) 7??

│ └── src

└── subproject-b

├── build.gradle(.kts)              └── src  
  1. 用于存儲包裝器文件等的 Gradle 目錄
  2. 可以用來規定整個項目工程中的插件的版本
  3. 只是個目錄
  4. 項目運行所需要的標準gradle安裝包,為不同的用戶和環境可以配置相同的gradle安裝包,建議使用。
  5. 指定第四項中的包可以去哪里下載,可以指定本地地址,也可以使用鏡像地址,還可以配置一些和安裝包有關的配置。
  6. Gradle 設置文件,用于定義根項目名稱和子項目等等,就相當于maven項目中跟項目的pom.xml
  7. 子項目的構建腳本

多項目構建

多項目構建有兩種:
    * 使用 buildSrc目錄 的多項目構建:  buildSrc目錄放在根目錄下一層中,也就是和根項目的子項目同層級。(SpringBoot源碼就是用的這種方式)* 復合構建: 官方文檔中描述的:// <font style="color:rgb(2, 48, 58);">最適合在 builds(</font>_<font style="color:rgb(2, 48, 58);">不是子項目</font>_<font style="color:rgb(2, 48, 58);">)之間共享 logic 或隔離對共享 build logic(即約定插件)的訪問。</font>

構建順序

1. 初始化 1. 檢測settings.gradle文件 2. 創建Settings實例 3. 確定需要構建哪些模塊(所以會在settings.gradle使用include標明有哪些模塊) 4. 為每一個模塊創建一個Project實例 2. 配置 1. 檢測每個模塊,也就是每個子項目中的build.gradle文件 2. 為請求的任務(就是task)創建任務圖 3. 執行任務 1. 分析任務圖的依賴關系 2. 執行任務

Settings.gradle文件(只有根目錄會有)

```plain // 管理插件的 pluginManagement { // 這里定義的plugins只是為了限定版本號,并不會實際引入插件,還需要子項目的build.gradle中引入實際的plugin 但是不需要加上版本號了 // 配置插件下載的倉庫地址 repositories { maven { url 'https://maven.aliyun.com/repository/gradle-plugin' } maven { url 'https://plugins.gradle.org/m2/' } mavenCentral() gradlePluginPortal() } // 可以對某個插件做特殊處理 resolutionStrategy { eachPlugin { if (requested.id.id == "org.jetbrains.kotlin.jvm") { useVersion "${kotlinVersion}" } if (requested.id.id == "org.jetbrains.kotlin.plugin.spring") { useVersion "${kotlinVersion}" } } } }

// 引入插件
plugins {
id “com.gradle.develocity” version “3.17.2”
id “io.spring.ge.conventions” version “0.0.17”
}

// 配置project實例的name屬性,可以直接點擊rootProject跳轉到java類中,就可以查看可以配置哪些屬性
rootProject.name=“spring-boot-build”

// 項目加載完需要執行的回調
settings.gradle.projectsLoaded {
develocity {
buildScan {
def toolchainVersion = settings.gradle.rootProject.findProperty(‘toolchainVersion’)
if (toolchainVersion != null) {
value(‘Toolchain version’, toolchainVersion)
tag(“JDK-KaTeX parse error: Expected 'EOF', got '}' at position 23: …inVersion") }? def buildDi…{scan.buildScanUri}|build scan>\n”
}
}
}
}

// 標明有哪些模塊
include “spring-boot-project:spring-boot-dependencies”

<h2 id="f8DHM">根目錄的build.gradle</h2>
```plain
buildscript {
//  規定了所有模塊中的build.gradle中需要用到的任務或者依賴,就到下面倉庫中,只針對構建腳本repositories {maven { url 'https://maven.aliyun.com/repository/central' }maven { url 'https://maven.aliyun.com/repository/public' }maven {url 'https://maven.aliyun.com/repository/apache-snapshots'}mavenLocal()mavenCentral()}dependencies {//  到上面指定的倉庫去找這個依賴classpath("io.spring.javaformat:spring-javaformat-gradle-plugin:0.0.15")}
}//  指定插件
plugins {id "base"// apply 默認是true, 表示自動開啟,也可以配置為false,根據條件開啟id "org.jetbrains.kotlin.jvm" apply false // https://youtrack.jetbrains.com/issue/KT-30276id "io.spring.nohttp" version "0.0.11"
}allprojects {//   設置了所有子項目都屬于  org.springframework.boot  分組group "org.springframework.boot"//  定義了多個Maven倉庫,項目實際代碼中需要的依賴都到下面幾個倉庫去下載repositories {maven {url 'https://maven.aliyun.com/repository/public/'}maven {url 'https://maven.aliyun.com/repository/central'}mavenLocal()mavenCentral()}configurations.all {resolutionStrategy.cacheChangingModulesFor 0, "minutes"}
}//  找到名為checkstyleNohttp 任務并且配置maxHeapSize屬性
tasks.named("checkstyleNohttp").configure {maxHeapSize = "1536m"
}
// 添加一個任務
task.register("one") {
}

模塊中的build.gradle


//  標明當前模塊需要哪些依賴,類似于pom文件
//  這里省略了版本號, 是因為在 spring-boot-dependencies中使用library方法規定了版本
//  類似于maven項目中專門用來放依賴的子項目,在這個pom文件已經指定了版本號,所以引用了這個項目的模塊不需要額外寫明版本號
dependencies {// api  編譯和運行時都需要的依賴項,并包含在已發布的 API 中implementation 'org.springframework.boot:spring-boot-starter-web' // 編譯和運行時都需要的依賴項api("org.springframework:spring-core")compileOnly 'org.projectlombok:lombok' // 僅編譯所需的依賴項,不包含在 runtime 或發布中runtimeOnly 'com.mysql:mysql-connector-j' // 僅在運行時需要的依賴項,不包含在 compile Classpath 中annotationProcessor 'org.projectlombok:lombok'   //  用于編譯時注解處理的工具,它可以在編譯時期處理注解,生成額外的代碼testImplementation 'org.springframework.boot:spring-boot-starter-test' // 編譯和運行測試所需的依賴項。testRuntimeOnly 'org.junit.platform:junit-platform-launcher'  // 僅運行測試所需的依賴項
}
api   				編譯和運行時都需要的依賴項,并包含在已發布的 API 中。
implementation    	編譯和運行時都需要的依賴項。
compileOnly			僅編譯所需的依賴項,不包含在 runtime 或發布中。
compileOnlyApi		依賴項僅需要用于編譯,但包含在已發布的 API 中。
runtimeOnly			僅在運行時需要的依賴項,不包含在 compile Classpath 中。
testImplementation	編譯和運行測試所需的依賴項。
testCompileOnly		僅測試編譯所需的依賴項。
testRuntimeOnly		僅運行測試所需的依賴項。//  將properties 寫入到這個目錄中的springBootVersion文件中
sourceSets {main {java {srcDirs syncJavaTemplates}}test {output.dir(tomcatConfigProperties, builtBy: "extractTomcatConfigProperties")}
}// 
def syncJavaTemplates = tasks.register("syncJavaTemplates", Sync) {from("src/main/javaTemplates")into("build/generated-sources/main")def properties = ["springBootVersion": project.version]expand(properties)inputs.properties(properties)
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/62501.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/62501.shtml
英文地址,請注明出處:http://en.pswp.cn/web/62501.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

PE文件結構:NT頭部

NT 頭部&#xff08;NT Header&#xff09;是 PE 文件格式的核心部分之一&#xff0c;它包含了有關程序如何加載、執行以及一些重要的文件屬性。NT 頭部常被認為是 PE 頭部 的核心或“真正的”PE 頭部&#xff0c;因為操作系統加載 PE 文件時&#xff0c;首先會查找 DOS 頭部的…

Oracle EBS FA 如何打開關閉的資產會計期間?

用戶“運行折舊”,誤勾選為“關閉期間”,還有一部分資產還需要操作報廢和調整,希望后臺打開關閉的資產會計期 系統環境 RDBMS : 12.1.0.2.0 Oracle Applications : 12.2.9 解決方案 由官方提供SQL腳本代碼如下: /*rollback120.sql - for Release 12.X only(based on r…

算法基礎學習Day6(動態窗口)

文章目錄 1.題目2.題目解答1.最大連續1的個數題目及題目解析算法學習思路一:暴力解法思路二:滑動窗口 代碼提交 2.將x減到0的最小操作數題目及題目解析算法學習滑動窗口解決問題 代碼提交 1.題目 1004. 最大連續1的個數 III - 力扣&#xff08;LeetCode&#xff09;1658. 將 x…

基于springboot+vue的公交線路查詢系統(全套)

一、系統架構 前端&#xff1a;vue | element-ui | html 后端&#xff1a;springboot | mybatis-plus 環境&#xff1a;jdk1.8 | mysql | maven | nodejs 二、代碼及數據庫 三、功能介紹 01. web端-首頁1 02. web端-首頁2 03. web端-注冊 04. web端-登錄 …

ASP.NET Core8.0學習筆記(二十五)——EF Core Include導航數據加載之預加載與過濾

一、導航屬性數據加載 1.在EF Core中可以使用導航屬性來加載相關實體。 2.加載實體的三種方式&#xff1a; (1)預先加載&#xff1a;直接在查詢主體時就把對應的依賴實體查出來&#xff08;作為初始查詢的一部分&#xff09; (2)顯式加載&#xff1a;使用代碼指示稍后顯式的從…

Linux 基礎環境的開發工具以及使用(下)

1. make / Makefile 自動化構建的工具 1&#xff09;引入 在我們進行一些大型的工程的時候&#xff0c;代碼量是極其大&#xff0c;當我們代碼在進行一系列的編譯的時候&#xff0c;難免會出現一些錯誤&#xff0c;當我們對錯誤進行一系列的更改之后&#xff0c;難道我們需要…

沃豐科技智能客服在跨境電商獨立站中的核心角色

隨著全球化進程的加速和互聯網技術的不斷發展&#xff0c;跨境電商行業蓬勃興起&#xff0c;為消費者提供了更廣闊、更便捷的購物選擇。在這樣一個競爭激烈的市場環境中&#xff0c;優質的客戶服務成為了企業脫穎而出的關鍵。沃豐科技智能客服憑借其先進的技術和人性化的設計理…

uniapp 彈出軟鍵盤后打開二級頁面,解決其UI布局變動

軟鍵盤彈出&#xff0c;此時點擊某按鈕打開二級頁面&#xff0c;position:fixed 位于底部的按鈕不見了&#xff08;通過加高其區域&#xff0c;發現被下移動了&#xff09;&#xff0c;什么原因不清楚? 但是發現是軟鍵盤彈出導致&#xff0c;問題解決通過隱藏鍵盤再打開二級頁…

Centos7下搭建Prometheus+Grafana監控

Prometheus 監控 Prometheus 監控系統的架構包括以下組件&#xff1a; Prometheus Server&#xff1a; Prometheus 服務器是監控系統的核心組件&#xff0c;負責收集、存儲和處理指標數據。它定期從各種數據源&#xff08;如 Exporter、Agent 等&#xff09;拉取指標數據&…

MyBatis-Plus(為簡化開發而生)

一、MyBatis-Plus概述 官網&#xff1a; baomidou.com MyBatis-Plus&#xff08;簡稱 MP&#xff09; 在 MyBatis 的基礎上只做增強不做改變&#xff0c;為簡化開發、提高效率而生。 &#xff08;1&#xff09;單表操作 不需要編寫sql語句&#xff0c;封裝方法&#xff0c;…

深入解析 C++11 的 `std::atomic`:誤區、性能與實際應用

在現代 C 開發中&#xff0c;std::atomic 是處理多線程同步時的重要工具之一。它通過提供原子操作保證了線程安全&#xff0c;但在實際使用時卻隱藏著許多不為人知的陷阱和性能影響。本篇文章將帶你深入理解 std::atomic 的使用方式、潛在問題&#xff0c;以及如何正確應用于多…

芋道源碼,芋道sql,yudao,yudao-vue-pro拒絕割韭菜

芋道的開發指南實際上只需要小小的操作就可以觀看啦 為了避免被割韭菜 我們可以使用插件去進行解鎖文檔 項目地址 otomayss/free-yd (github.com)[這里是圖片002]https://github.com/otomayss/free-yd

Mac軟件推薦

Mac軟件推薦 截圖SnipasteXnipBob 快捷啟動Raycast 系統檢測Stats 解壓縮The UnarchiverKeka&#xff08;付費&#xff09; 視頻播放IINA 視頻下載Downie&#xff08;付費&#xff09; 屏幕劉海TopNotchMediaMate&#xff08;付費&#xff09;NotchDrop&#xff08;付費&#x…

【ETCD】【源碼閱讀】 深入解析 raftNode.start`函數:Raft 核心啟動邏輯剖析

raftNode.start方法 是 etcd 中 Raft 模塊的核心啟動點&#xff0c;其職責是管理 Raft 狀態機的狀態變遷、日志處理及集群通信等邏輯。通過對源碼的逐行分析&#xff0c;我們將全面揭示其運行機制&#xff0c;探討其設計背后的分布式系統理念。 函數核心結構 raftNode.start 方…

車站值班員題庫

1. 聯系用手信號顯示十、五、三車距離信號中的“三車”&#xff08;約33m&#xff09;信號時&#xff0c;晝間的顯示方式為展開的綠色信號旗單臂平伸下壓 &#xff08; 一 &#xff09;次。J442 2. 聯系用手信號顯示股道號碼時&#xff0c;晝間右臂向上直伸&#xff0c…

BI中場戰事:國外廠商退,國產廠商進

從沉睡的黃金到經濟的新寵&#xff0c;數據要素正上演華麗轉身。 近年來&#xff0c;數字經濟的長驅向前&#xff0c;離不開數據要素價值釋放所帶來的持續動力。作為第五大生產要素&#xff0c;數據要素的價值釋放需要從數據采集、傳輸到存儲、治理&#xff0c;再到分析和可視…

2024年華中杯數學建模C題基于光纖傳感器的平面曲線重建算法建模解題全過程文檔及程序

2024年華中杯數學建模 C題 基于光纖傳感器的平面曲線重建算法建模 原題再現 光纖傳感技術是伴隨著光纖及光通信技術發展起來的一種新型傳感器技術。它是以光波為傳感信號、光纖為傳輸載體來感知外界環境中的信號&#xff0c;其基本原理是當外界環境參數發生變化時&#xff0c…

【LeetCode每日一題】LeetCode 209.長度最小的子數組

LeetCode 209.長度最小的子數組 題目描述 給定一個正整數數組 nums 和一個正整數 target&#xff0c;找出連續子數組的最小長度&#xff0c;使得子數組的和大于或等于 target。如果不存在符合條件的子數組&#xff0c;返回 0。 Java 實現代碼 public class Solution {publi…

【openwrt】openwrt-21.02 基于IP地址使用ipset實現策略路由操作說明

openwrt版本信息 DISTRIB_ID=OpenWrt DISTRIB_RELEASE=21.02-SNAPSHOT DISTRIB_REVISION=r0-6bf6af1d5 DISTRIB_TARGET=mediatek/mt7981 DISTRIB_ARCH=aarch64_cortex-a53 DISTRIB_DESCRIPTION=OpenWrt 21.02-SNAPSHOT r0-6bf6af1d5 DISTRIB_TAINTS=no-all busybox override …

【H2O2|全棧】MySQL的基本操作(三)

目錄 前言 開篇語 準備工作 案例準備 多表查詢 笛卡爾積 等值連接 外連接 內連接 自連接 子查詢 存在和所有 含于 分頁查詢 建表語句 結束語 前言 開篇語 本篇繼續講解MySQL的一些基礎的操作——數據字段的查詢中的多表查詢和分頁查詢&#xff0c;與單表查詢…