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

目录

个人主页: 【⭐️个人主页

需要您的【💖 点赞+关注】支持 💯


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

📖 本文核心知识点:

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

Gradle任务

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

查看可用任务

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

Bash 复制代码
./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子项目中可用的任务

groovy 复制代码
tasks.register("copyTask",Copy) {
    from("source")
    into("target")
    include("*.war")
}

探索任务依赖性

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

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

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

    groovy 复制代码
    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

groovy 复制代码
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文件。

然后,将以下行添加到此新文件中:

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文件中,相应地更新依赖块:

groovy 复制代码
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的一些配置。

配置需要根据 插件文档说明去在对应的文件添加

groovy 复制代码
publishing {
    publications {
        mavenJava(MavenPublication)("maven") {
            groupId = "org.gradle.tutorial"
            artifactId = "tutorial"
            version = "1.0"

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

增量构建

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

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

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

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

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

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-SOURCE T任务未执行,因为其所需的输入不可用

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

启用缓存

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

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

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

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

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会定期清理本地构建缓存目录,删除最近没有使用的条目,以节省磁盘空间。

相关推荐
yzpyzp8 小时前
Android studio在点击运行按钮时执行过程中输出的compileDebugKotlin 这个任务是由gradle执行的吗
android·gradle·android studio
用户5248034919913 天前
Gradle 镜像地址设置
gradle
~央千澈~13 天前
老项目Android开发环境搭建的困境与解决之道-优雅草卓伊凡
gradle·android开发·安卓开发
泓博15 天前
Gradle上传依赖包到私有仓库
gradle
yzpyzp19 天前
KAPT 的版本如何升级,是跟随kotlin的版本吗
android·kotlin·gradle
4060ti23 天前
gradle 入门
java·gradle
BoomHe23 天前
Android 搭建模块化项目流程及建议
android·架构·gradle
敲代码的剑缘一心24 天前
手把手教你学会写 Gradle 插件
android·gradle
5upport1 个月前
Gradle Version Catalog的IDE辅助工具
gradle·android studio·intellij idea
zmm04201 个月前
Could not get unknown property ‘mUser‘ for Credentials [username: null]
jenkins·gradle