【3】Gradle-快速入门使用【Gradle概念】

news2025/1/15 23:41:49

目录

  • 【3】Gradle-快速入门使用【Gradle概念】
    • Gradle任务
      • 查看可用任务
      • 了解任务
      • 探索任务依赖性
    • 依赖关系
      • 了解传递依赖关系
      • 查看项目依赖项
      • 添加版本目录 【可选】
    • 插件
      • 使用插件
      • 查看插件提供的任务
      • 配置插件
    • 增量构建
    • 启用缓存
      • 使用构建缓存步骤
      • 总结

个人主页: 【⭐️个人主页】
需要您的【💖 点赞+关注】支持 💯


在这里插入图片描述

【3】Gradle-快速入门使用【Gradle概念】

📖 本文核心知识点:

  • 任务
  • 任务的依赖关系
  • 库依赖关系
  • 插件
  • 构建缓存

Gradle任务

通过运行一个任务并查看其输出来学习Gradle任务的基础知识

查看可用任务

我们可以使用 Gradle Wrapper包装器工具查看可用的任务列表

./gradlew tasks

在这里插入图片描述
显示Gradle项目下可执行的所有任务,包括各个环节的任务列表。
而一项任务可能负责编译复制移动文件创建JAR文件生成Javadoc将工件发布到存储库或许多其他离散的工作单元。

在Maven中,我们执行一个命令,执行Maven的生命周期 Phase 。
clean > resource -> compile -> package > install > deploy 等

但是在Gradle中,没有Maven的Phase生命周期阶段概念。只有一个一个的任务。相当于任务代替了每个生命周期phase的工作。

您还可以通过运行./gradlew :app:tasks列出仅在app子项目中可用的任务。

了解任务

您还可以通过运行./gradlew :app:tasks列出仅在app子项目中可用的任务

tasks.register("copyTask",Copy) {
    from("source")
    into("target")
    include("*.war")
}

探索任务依赖性

很多时候,一项任务需要先运行另一项任务。如果任务B使用任务A的输出,那么任务A必须在任务B开始之前完成。

  • 任务可以明确声明其依赖关系

  • 一项任务可能隐含地取决于其他任务。

    tasks.register("hello") {
        println('Hello!')
    }
    
    tasks.register("greet") {
        println('How are you?')
        dependsOn("hello")
    }
    
    kongxiang@kongxiangdeMacBook-Pro:./gradlew :buildSrc:greet
    How are you?
    Hello!
    

    任务执行顺序由Gradle自动确定,同时考虑到显式和隐式的任务依赖性。如果任务之间没有依赖性,Gradle允许用户请求特定的执行顺序。

在IDE中查看任务
在这里插入图片描述

依赖关系

Gradle为依赖管理和自动化提供了出色的支持。
build.gradle


repositories {
   mavenCentral()
}

dependencies {
   //implementation 'org.springframework.modulith:spring-modulith-starter-core'
   implementation 'org.springframework.boot:spring-boot-starter-web'
   compileOnly 'org.projectlombok:lombok'
   developmentOnly 'org.springframework.boot:spring-boot-devtools'
   //developmentOnly 'org.springframework.boot:spring-boot-docker-compose'
   runtimeOnly 'com.mysql:mysql-connector-j'
   annotationProcessor 'org.springframework.boot:spring-boot-configuration-processor'
   annotationProcessor 'org.projectlombok:lombok'
   testImplementation 'org.springframework.boot:spring-boot-starter-test'
   testImplementation 'org.springframework.modulith:spring-modulith-starter-test'
}

Gradle依赖管理的一些关键概念包括:

repositories 存储库
Mavne中的Repositories一样的概念

依赖项的来源 →mavenCentral()
Maven Central是由Maven社区提供并由Sonatype支持的jar文件、插件和库的集合。它是Java事实上的公共工件存储,被许多构建系统使用。

依赖项
等同于Maven中的依赖<dependency>,根据坐标查找依赖

通过配置类型声明的依赖项

坐标: Group Name Version
在这里插入图片描述

了解传递依赖关系

传递依赖 指的是在我们使用一个外部工具时,我们只引入了该工具的包
如:slf4j,但是slf4j也会使用其他第三方库。因为我们只引入了slf4j,其他的第三方没有明确引入。那么我们使用slf4j的功能,就会缺少slf4j 的依赖。
所以就需要依赖传递,将slf4j的依赖,也要一起下载下来。

Maven包含依赖传递。所以当我们使用spring框架的时候,会把所有spring框架依赖的包,通过依赖传递解析,并下载下来。我们只需要等待下载完成,直接运行即可。

查看项目依赖项

您可以使用./gradlew :app:dependencies命令在终端中查看您的依赖树:
在这里插入图片描述
清晰的显示,项目的包的依赖,包括依赖传递的包

添加版本目录 【可选】

版本目录用于声明项目在中心位置的所有直接依赖关系。
它在gradle/libs.versions.toml中创建,并在子项目构建文件中引用。
首先,在gradle目录中创建libs.versions.toml文件。
然后,将以下行添加到此新文件中:

[versions]
junitVer = "5.9.1"
guavaVer = "32.1.2-jre"

[libraries]
junit = { module = "org.junit.jupiter:junit-jupiter", version.ref = "junitVer" }
guava = { module = "com.google.guava:guava", version.ref = "guavaVer" }

在您的app/build.gradle文件中,相应地更新依赖块:

dependencies {
    testImplementation(libs.junit)
    implementation(libs.guava)
}

与直接在构建脚本中声明依赖项相比,版本目录提供了许多优势:

  • Gradle从目录中生成类型安全的访问器,以便您可以在IDE中通过自动完成轻松添加依赖项。

  • 它是声明依赖项版本的中心位置,以便任何更改都适用于每个子项目。

插件

插件是组织构建逻辑和在项目中重用构建逻辑的主要方法。

将插件应用于项目执行代码,这些代码可以创建任务、配置属性或以其他方式扩展项目的功能。通常,插件使用Gradle API来提供额外的功能并扩展Gradle的核心功能。

插件可以:

  • 向项目添加任务(例如编译、测试)。

  • 扩展基本的Gradle模型(例如添加可以配置的新DSL元素)。

  • 根据惯例配置项目(例如添加新任务或配置合理的默认值)。

  • 应用特定配置(例如添加组织存储库或执行标准)。

  • 通过扩展向现有类型添加新的属性和方法。

使用插件

在这里插入图片描述

build.gradle文件中,应用插件到项目中【与项目捆绑】

  • java插件提供java相关能力
  • spring boot 提供spring依赖管理功能。

查看插件提供的任务

在这里插入图片描述
如上,我们看到spring插件提供给我们的启动任务。我们可以通过点击执行插件或通过命令行./gradlew bootRun执行插件任务。

配置插件

有的插件提供的任务,可能需要我们配置,才能具体执行任务
比如:Maven-publish 插件,就需要我们配置publish的一些配置。
配置需要根据 插件文档说明去在对应的文件添加


publishing {
    publications {
        mavenJava(MavenPublication)("maven") {
            groupId = "org.gradle.tutorial"
            artifactId = "tutorial"
            version = "1.0"

            from(components["java"])
        }
    }
}

增量构建

重要的是要知道Gradle会以多种方式优化你的构建。其中一种优化称为·增量构建·

增量构建是一种构建,它避免运行自上一个构建以来没有更改输入的任务,从而使这些任务的执行变得不必要。

为了使增量构建工作,任务必须定义它们的输入输出。在构建时,Gradle将确定输入或输出是否已经更改。如果它们已经更改,Gradle将执行该任务。否则,它将跳过执行。

为了更好地了解增量构建的实际情况,我们将把控制台输出切换为verbose。

在 顶层目录下创建文件gradle.properties配置文件,修改控制台日志登记

# Updating Gradle Properties
org.gradle.console=verbose
  1. 执行构建任务./gradlew clean build
  2. 执行构建任务./gradlew build

    在这里插入图片描述

  3. 现在大多数任务都有“UP-TO-DATE”标签。这就是Gradle让我们知道输入和输出没有改变的方式,因此一些任务没有重新运行
  4. 当打开详细模式时,开发人员可以使用四个标签来查看任务结果:
标签描述
UP-TO-DATE已执行且未更改的任务(增量构建功能)
SKIPPED任务被显式阻止运行
FROM-CACHE任务输出已从先前的构建缓存(缓存特性)
NO-SOURCET任务未执行,因为其所需的输入不可用

如果没有标签,则任务是由Gradle(本地)新执行的。

启用缓存

·增量构建·是一种很好的优化,有助于避免已经完成的工作。如果开发人员不断地对单个文件进行更改,则可能不需要重新构建项目中的所有其他文件。

但是,当同一个开发人员决定切换到上周创建的新分支时,会发生什么呢?文件被重新构建,即使开发人员正在构建以前已经构建过的东西。

这就是构建缓存有用的地方。缓存存储以前的构建结果,并且大大减少了在本地已经构建的东西重新构建的需要。

gradle.properties中增加配置打开缓存

org.gradle.caching=true

使用构建缓存步骤

  1. 第一次执行 ./gradlew clean build

  2. 执行./gradlew build,这里使用增量构建UP-TO-DATE

    这并不奇怪,多亏了增量构建,Gradle没有发现任何变化。但是,在后台,本地构建缓存已经被填充。

  3. 第二次执行 ./gradlew clean build

    在这里插入图片描述

    Gradle让我们在控制台输出中知道每个任务的结果:

    • FROM-CACHE 任务已从本地生成缓存中获取。

    • UP-TO-DATE 使用增量构建且未重新运行的任务。

总结

  1. 首先,我们使用构建任务用任务输入和输出填充本地缓存——我们可以想象这是在一周前完成的。

  2. 然后,我们使用clean任务来模拟切换分支——覆盖之前的输出。

  3. 最后,我们使用构建任务——与增量构建不同,之前的输出存储在本地缓存中,并且可以重用。

Gradle是高效的,尤其是在打开本地构建缓存的情况下。Gradle将查看您机器上的缓存目录,以检查可能已经存在的输出文件。如果它们这样做,它将把它的(输出)结果复制到您的项目构建目录中,而不是运行该任务。

结果标签from - cache让用户知道Gradle已经从本地构建缓存中获取了任务结果。

本地Gradle构建缓存位于:

Windows:%USERPROFILE%\.gradle\cache

OS X / UNIX上:~/.gradle/缓存/

Gradle会定期清理本地构建缓存目录,删除最近没有使用的条目,以节省磁盘空间。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1197747.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【tg】 5 :线程切换

manager 可以切到 其他类的其他线程去执行。线程切换 先通过 networkmgr 线程 执行 ,但是传递了Manager 自己的线程 进去。在networkmgr 的network线程中,获取到stats数据,然后扔给 manager的线程thread ,去posttask 还行这个task里调用了mediamanager 的perform ,在media…

研究方法——案例研究设计与方法

作者&#xff1a;罗伯特K.殷 &#xff08;一&#xff09;计划&#xff1a;如何把握何处、何时用案例研究方法 1.问题&#xff1a; 按照作者的观点&#xff0c;案例研究1984年之后才逐渐得到重视&#xff0c;可是在数据信息有效收集的时代&#xff0c;几乎所有的经典都是以案例…

[西湖论剑 2022]real_ez_node

文章目录 前置知识EJS模板注入&#xff08;CVE-2022-29078&#xff09;原型链污染漏洞 &#xff08;CVE-2021-25928&#xff09;HTTP响应拆分攻击&#xff08;CRLF&#xff09; 解题过程代码审计构造payload 前置知识 EJS模板注入&#xff08;CVE-2022-29078&#xff09; EJS…

LeetCode18-四数之和

注意!其中nums数值的范围,四个加一起会导致INT溢出,long类型则是64位的整数,因此不会导致溢出,这也是本题难点之一! 大佬解法(拿捏offer的解法) 经过反复的代码比对和Debug,发现大佬解法的速度之快体现在足足7个if语句的剪枝,其中包括了2个关键性的去重的if语句以及2个关键性…

openpnp - 74路西门子飞达控制板(主控板STM32_NUCLEO-144) - 验证

文章目录 openpnp - 74路西门子飞达控制板(主控板STM32_NUCLEO-144) - 验证概述笔记重复数字IO的问题想法手工实现程序实现确定要摘掉的数字重合线自动化测试的问题测试程序的场景测试程序的运行效果测试程序实现备注END openpnp - 74路西门子飞达控制板(主控板STM32_NUCLEO-14…

推荐这款机器学习的特征筛选神器!

大家好&#xff0c;特征选择是机器学习建模流程中最重要的步骤之一&#xff0c;特征选择的好坏直接决定着模型效果的上限&#xff0c;好的特征组合甚至比模型算法更重要。除了模型效果外&#xff0c;特征选择还有以下几点好处&#xff1a; 提高模型性能并降低复杂性&#xff08…

Spring Cloud学习(六)【统一网关 Gateway】

文章目录 网关的功能搭建网关服务路由断言工厂Route Predicate Factory路由过滤器 GatewayFilter过滤器执行顺序跨域问题处理 网关的功能 网关功能&#xff1a; 身份认证和权限校验服务路由、负载均衡请求限流 在SpringCloud中网关的实现包括两种&#xff1a; gatewayzuul …

到底是什么是Python?语言的核心是什么?

文章目录 前言一、为什么提出python编程的核心是什么&#xff1f;二、Python需要REPL&#xff1f;三、Python的哪些部分需要被视为“Python”&#xff1f;四、需要多少兼容性才能有用&#xff1f;Python技术资源分享1、Python所有方向的学习路线2、学习软件3、精品书籍4、入门学…

计算机网络技术

深入浅出计算机网络 微课视频_哔哩哔哩_bilibili 第一章概述 1.1 信息时代的计算机网络 1. 计算机网络各类应用 2. 计算机网络带来的负面问题 3. 我国互联网发展情况 1.2 因特网概述 1. 网络、互连网&#xff08;互联网&#xff09;与因特网的区别与关系 如图所示&#xff0…

Windows11跳过联网激活 跳过登陆操作

1 背景 笔者使用VirtualBox时安装Win11&#xff0c;初始化的配置提示需要注册账户才能进行下一步操作&#xff0c;于是去查了一下发现有办法绕过&#xff0c;方法就是断网oobe\ByPassNRO.cmd&#xff0c;试了一下发现可以&#xff0c;便有了这篇文章。 2 流程 开机之前&…

【星海随笔】SDN neutron (二) Neutron-plugin(ML2)

Neutron架构之Neutron-plugin Core-plugin(ML2)篇 Neutron-server接收两种请求&#xff1a; REST API请求&#xff1a;接收REST API请求&#xff0c;并将REST API分发到对应的Plugin&#xff08;L3RouterPlugin&#xff09;。 RPC请求&#xff1a;接收Plugin agent请求&#…

QT 布局管理综合实例

通过一个实例基本布局管理&#xff0c;演示QHBoxLayout类、QVBoxLayout类及QGridLayout类效果 本实例共用到四个布局管理器&#xff0c;分别是 LeftLayout、RightLayout、BottomLayout和MainLayout。 在源文件“dialog.cpp”具体代码如下&#xff1a; 运行效果&#xff1a; Se…

【Spring】SpringBoot日志

SpringBoot日志 日志概述日志使用打印日志获取日志对象使用日志对象打印日志日志框架介绍门面模式SLF4J框架介绍(simple logging facade for java) 日志格式说明日志级别日志级别的分类日志级别的使用 日志配置配置日志级别日志持久化配置日志文件的路径和文件名配置日志文件的…

centos7安装linux版本的mysql

1.下载linux版本的mysql 进入mysql官网&#xff0c;点击社区版本下载&#xff1a; https://dev.mysql.com/downloads/mysql/ 选择版本&#xff0c;可以跟着我下面这个图进行选择&#xff0c;选择红帽版本的既可&#xff0c;都是linux版本的。 2.上传解压linux版本的mysql安装包…

C++初阶--类与对象(3)(图解)

文章目录 再谈构造函数初始化列表隐式类型转换explicit关键字 static成员友元类内部类匿名对象拷贝函数时的一些优化 再谈构造函数 在我们之前的构造函数中&#xff0c;编译器会通过构造函数&#xff0c;对对象中各个成员给出一个适合的初始值&#xff0c;但这并不能称之为初始…

思维模型 超限效应

本系列文章 主要是 分享 思维模型&#xff0c;涉及各个领域&#xff0c;重在提升认知。物极必反。 1 超限效应的应用 1.1 教育中的超限效应 一位老师在课堂上批评了一位学生&#xff0c;这位学生可能会因为老师的批评而感到沮丧和失落。如果老师在接下来的课程中继续批评这位…

数据结构与算法—搞懂队列

csdn专栏&#xff1a;数据结构与算法 前言 栈和队列是一对紧密相关的数据结构。之前已经介绍过栈&#xff08;它遵循后进先出的原则&#xff09;&#xff0c;栈的机制相对简单&#xff0c;就像你进入一个狭窄的山洞&#xff0c;山洞只有一个出入口&#xff0c;因此你只能按照后…

【原创分享】Mentor PADS将PCB封装直接添加到PCB的教程

一般&#xff0c;批量添加封装到PCB板上有以下方法&#xff1a; 第一步&#xff1a;点击菜单栏“ECO模式--添加元器件”如图&#xff0c;点击以后弹出如图界面。 1&#xff09;元件类型 PCB封装必须得添加完元件类型&#xff0c;才能通过ECO模式添加到PCB界面里面&#xff0c…

[Linux打怪升级之路]-信号的保存和递达

前言 作者&#xff1a;小蜗牛向前冲 名言&#xff1a;我可以接受失败&#xff0c;但我不能接受放弃 如果觉的博主的文章还不错的话&#xff0c;还请点赞&#xff0c;收藏&#xff0c;关注&#x1f440;支持博主。如果发现有问题的地方欢迎❀大家在评论区指正 目录 一、信号的保…

红黑树-RBTree

目录 1. 红黑树的概念2. 红黑树的性质3. 结点的定义4. 结点的插入5. 整体代码 1. 红黑树的概念 红黑树&#xff0c;是一种二叉搜索树&#xff0c;但在每个结点上增加一个存储位表示结点的颜色&#xff0c;可以是Red或Black。 通过对任何一条从根到叶子的路径上各个结点着色方式…