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.mzph.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;与单表查询…