个人主页: 【⭐️个人主页】
需要您的【 点赞+关注】支持
本文核心知识点:
通过运行一个任务并查看其输出来学习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中的依赖
,根据坐标查找依赖
通过配置类型声明的依赖项
传递依赖
指的是在我们使用一个外部工具时,我们只引入了该工具的包
如: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
文件中,应用插件到项目中【与项目捆绑】
如上,我们看到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
./gradlew clean build
./gradlew build
UP-TO-DATE
”标签。这就是Gradle让我们知道输入和输出没有改变的方式
,因此一些任务没有重新运行
。标签 | 描述 |
---|---|
UP-TO-DATE | 已执行且未更改的任务(增量构建功能) |
SKIPPED | 任务被显式阻止运行 |
FROM-CACHE | 任务输出已从先前的构建缓存(缓存特性) |
NO-SOURCE | T任务未执行,因为其所需的输入不可用 |
如果没有标签,则任务是由Gradle(本地)新执行的。
·增量构建·
是一种很好的优化,有助于避免已经完成的工作。如果开发人员不断地对单个文件进行更改
,则可能不需要重新构建项目中的所有其他文件。
但是,当同一个开发人员决定切换到上周创建的新分支
时,会发生什么呢?文件被重新构建,即使开发人员正在构建以前已经构建过的东西。
这就是构建缓存有用的地方。缓存存储以前的构建结果
,并且大大减少了在本地已经构建的东西重新构建的需要。
在gradle.properties
中增加配置打开缓存
org.gradle.caching=true
第一次执行 ./gradlew clean build
执行./gradlew build
,这里使用增量构建UP-TO-DATE
这并不奇怪,多亏了增量构建,Gradle没有发现任何变化。但是,在后台,本地构建缓存已经被填充。
第二次执行 ./gradlew clean build
Gradle让我们在控制台输出中知道每个任务的结果:
FROM-CACHE
任务已从本地生成缓存中获取。
UP-TO-DATE
使用增量构建且未重新运行的任务。
首先,我们使用构建任务用任务输入和输出填充本地缓存——我们可以想象这是在一周前完成的。
然后,我们使用clean任务来模拟切换分支——覆盖之前的输出。
最后,我们使用构建任务——与增量构建不同,之前的输出存储在本地缓存中,并且可以重用。
Gradle是高效的
,尤其是在打开本地构建缓存
的情况下。Gradle将查看您机器上的缓存目录,以检查可能已经存在的输出文件。如果它们这样做,它将把它的(输出)结果复制到您的项目构建目录中,而不是运行该任务。
结果标签from - cache
让用户知道Gradle已经从本地构建缓存
中获取了任务结果。
本地Gradle构建缓存位于:
在Windows
上:%USERPROFILE%\.gradle\cache
在OS X / UNIX
上:~/.gradle/缓存/
Gradle会
定期清理
本地构建缓存目录,删除最近没有使用的条目,以节省磁盘空间。