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

目录

  • 【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.mfbz.cn/a/133263.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

JVM虚拟机:垃圾回收器之CMS(老年代)

本文重点 在前面的课程中我们学习了Serial和PO垃圾回收器,本文将学习一种新的在老年代使用的垃圾回收器CMS。 特点 CMS收集器是一种以获取最短回收停顿时间为目标的收集器(还是会有短暂的STW),适合互联网或者B/S系统的服务器上,这类应用尤其重视服务器的响应速度,希望…

反转链表 --- 递归回溯算法练习三

目录 1. 分析题意 2. 分析算法原理 2.1. 递归思路&#xff1a; 1. 挖掘子问题&#xff1a; 3. 编写代码 3.1. step 1&#xff1a; 3.2. step 2&#xff1a; 3.3. step 3&#xff1a; 3.4. 递归代码&#xff1a; 1. 分析题意 力扣原题链接如下&#xff1a; 206. 反转链…

巧用ADB安卓调试工具,在双十一直播间轻松回复文字领取优惠!

微信改版了&#xff0c;现在看到我们全凭缘分&#xff0c;为了不错过【全栈工程师修炼指南】重要内容及福利&#xff0c;大家记得按照上方步骤设置「接收文章推送」哦~ 关注回复【学习交流群】加入【SecDevOps】学习交流群! 文章目录&#xff1a; 1.前言简述 描述: 通过前面几篇…

【AICFD案例教程】进气歧管分析

AICFD是由天洑软件自主研发的通用智能热流体仿真软件&#xff0c;用于高效解决能源动力、船舶海洋、电子设备和车辆运载等领域复杂的流动和传热问题。软件涵盖了从建模、仿真到结果处理完整仿真分析流程&#xff0c;帮助工业企业建立设计、仿真和优化相结合的一体化流程&#x…

【那些反爬和反反爬】xpath根据兄弟节点定位元素

其实这篇不涉及什么高大上的反爬&#xff0c;但是实在不知道要把这篇文章归类到哪里&#xff0c;就直接先扔这里吧。 先吐槽一句&#xff1a;萌娘百科绝对是我再也不想爬第二次的网站。 第二句&#xff1a;&#xff08;真理&#xff09;把网站弄得越乱越让人摸不着头脑&#…

【2024提前批/秋招笔试汇总2】——大疆-嵌入式软件-2023.08.06

一、 单选题&#xff08;40分&#xff09; 1. 以下关于GPU的特点描述不准确的是&#xff1a; A.GPU无法使用共享内存结构&#xff0c;提高通信速度 B.GPU的并行数据处理可以大幅度提高运算能力 C.GPU使用高速全局内存可以进一步提升运算速度 D.GPU的计算能力比CPU强 2.下列关…

技术架构-单机架构

前言 从今天开始系统学习 Docker 课程&#xff0c;总结下 Docker 是什么&#xff0c;用来做什么&#xff0c;架构是怎样的。 注&#xff1a;&#xff08;1&#xff09;当浏览器 / APP访问服务器时&#xff0c;如果服务器适用的时 http 协议&#xff0c;那么默认端口时80&#…

Learn runqlat in 5 minutes

内容预告 learn X in 5 系列第一篇. 本篇主要介绍进程时延统计方式和 rawtracepoint. runqlat "高负载场景下应用为何卡顿", "进程 A 为什么得不到调度". 当我们在工作生活中产生这样的疑问, 目标进程的调度时延是一个不错的观测切入点. runqlat 可以帮…

CentOs7 NAT模式连接网络

1.配置动态网络 1.1 检查主机网卡配置 检查主机的网络设置 进入控制面板&#xff0c;找到网络共享中心 查看适配器是否都已经开启 1.2 设置虚拟机的网络配置 打开虚拟机网络配置设置&#xff0c;对网卡VMnet8 进行设置 记住网关 全部选择应用&#xff0c;确定 1.3 设置…

数据结构:树的基本概念(二叉树,定义性质,存储结构)

目录 1.树1.基本概念1.空树2.非空树 2.基本术语1.结点之间的关系描述2.结点、树的属性描述3.有序树、无序树4.森林 3.树的常考性质 2.二叉树1.基本概念2.特殊二叉树1.满二叉树2.完全二叉树3.二叉排序树4.平衡二叉树 3.常考性质4.二叉树的存储结构1.顺序存储2.链式存储 1.树 1.…

PyTorch技术和深度学习——三、深度学习快速入门

文章目录 1.线性回归1&#xff09;介绍2&#xff09;加载自由泳冠军数据集3&#xff09;从0开始实现线性回归模型4&#xff09;使用自动求导训练线性回归模型5&#xff09;使用优化器训练线性回归模型 2.使用torch.nn模块构建线性回归模型1&#xff09;使用torch.nn.Linear训练…

文件改名:避免繁琐操作,利用筛选文件批量重命名技巧优化文件管理

在我们的日常生活和工作中&#xff0c;我们经常需要处理大量的文件&#xff0c;从文档、图片到音频和视频等。在这些情况下&#xff0c;一个高效的文件管理策略至关重要。文件重命名的必要性主要体现在两个方面。首先&#xff0c;对于大量文件&#xff0c;手动进行重命名不仅费…

邻接矩阵储存图实现深度优先遍历(C++)

目录 基本要求&#xff1a; 图的结构体&#xff1a; 图的构造&#xff1a; 图的深度优先&#xff08;DFS&#xff09;&#xff1a; 图的打印输出&#xff1a; 完整代码&#xff1a; 测试数据&#xff1a; 运行结果&#xff1a; 通过给出的图的顶点和边的信息&#xff0c…

Sprint Boot 学习路线 4

微服务 Spring Microservices是一个框架&#xff0c;它使用Spring框架更容易地构建和管理基于微服务的应用程序。微服务是一种架构风格&#xff0c;其中一个大型应用程序被构建为一组小型、独立可部署的服务。每个服务具有明确定义的职责&#xff0c;并通过API与其他服务通信。…

S7-1200PLC和SMART PLC开放式以太网通信(UDP双向通信)

S7-1200PLC的以太网通信UDP通信相关介绍还可以参考下面文章链接: 博途PLC开放式以太网通信TRCV_C指令应用编程(运动传感器UDP通信)-CSDN博客文章浏览阅读2.8k次。博途PLC开放式以太网通信TSENG_C指令应用,请参看下面的文章链接:博途PLC 1200/1500PLC开放式以太网通信TSEND_…

Flink之Table API SQL连接器

连接器 Table API & SQL连接器1.概述2.支持连接器 DataGen连接器1.概述2.SQL客户端执行3.Table API执行 FileSystem连接器1.创建FileSystem映射表2.创建source数据源表3.写入数据4.解决异常5.查询fileTable6.查看HDFS Kafka连接器1.添加kafka连接器依赖2.重启yarn-session、…

vue.cli 中怎样使用自定义的组件

目录 创建自定义组件 注册并使用自定义组件 全局注册自定义组件 使用 Props 传递数据 总结 前言 在Vue CLI中使用自定义组件是构建交互式和模块化Web应用的重要一环。Vue CLI为开发者提供了使用自定义组件的灵活性和简便性。通过Vue CLI&#xff0c;你可以创建、注册和使…

【算法练习Day45】最长公共子序列不相交的线最大子数组和

​&#x1f4dd;个人主页&#xff1a;Sherry的成长之路 &#x1f3e0;学习社区&#xff1a;Sherry的成长之路&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;练题 &#x1f3af;长路漫漫浩浩&#xff0c;万事皆有期待 文章目录 最长公共子序列不相交的线最…

开发者眼中的向量数据库应用领域

目录 引言向量数据库概念向量数据库优势应用领域亚马逊云科技向量数据库向量数据库的使用步骤最后 引言 随着人工智能和大数据技术的快速发展&#xff0c;越来越多的技术倾向于数据存储方面&#xff0c;数据库领域也随着人工智能和大数据的发展而发展&#xff0c;尤其是向量…

月销破30万辆后,比亚迪整了波大的

最近乘联会公布了 2023 年 10 月新能源乘用车厂商销量榜单。 其中最为亮眼犹如鹤立鸡群的榜首&#xff0c;没错依然是我们熟悉的那个迪子&#xff01; 单月销量超 30 万辆&#xff0c;相较去年同期暴涨 38.4%&#xff0c;创下了比亚迪有史以来新高。 同时也成为了国内首个月销…
最新文章