什么是gradle
gradle是一个构建工具,类似于maven。但是在运行速度以及灵活性上远远超过maven
gradle的核心概念
个人理解,如有错误请指正
gradle的核心是一个Project对象,也就是说,gradle在运行之后,会根据你当前的目录结构和配置文件,构建出一个project对象,而你写的build.gradle或者build.gradle.kts就是是用来修改project对象的相关属性。
下面这个图展示的是project对象的定义,其中我们可以看到很多熟悉的属性:group、version、repositories
下图中我们写的代码其实就是在修改Project对象中的部分属性
理解build.gradle.kts
plugins {
java
id("org.springframework.boot") version "3.1.4"
}
group = "xxx"
tasks.create("shi") {
shouldRunAfter("compile")
description = "shit"
println(project.projectDir)
val a = Runtime.getRuntime().exec(arrayOf("git", "rev-parse", "HEAD"))
a.waitFor()
val version = String(a.inputStream.readAllBytes())
//file 函数自动从当前工程的工作目录开始
val file = file( "src/main/resources/version")
file.writeBytes(version.toByteArray())
}
springBoot {
mainClass = "cebci.cli.Cli"
}
repositories {
mavenCentral()
}
dependencies {
implementation("com.google.guava:guava")
implementation("com.beust:jcommander:1.82")
implementation("io.undertow:undertow-core:2.3.8.Final")
implementation("io.undertow:undertow-servlet:2.3.8.Final")
implementation("com.mysql:mysql-connector-j:8.1.0")
implementation("io.netty:netty-all:4.1.97.Final")
}
tasks.withType<Test> {
useJUnitPlatform()
}
- 第6行,由于在kotlin中set方法可以省略,所以可以直接写成 属性=属性值
- 第1、20、24、28行是kotlin中函数最后一个参数为lamda表达式的一种简写,我们以repositories函数为例
上面是一段kotlin中的带接受者的lamda函数代码,所谓带接受者的lamda函数,可以简单理解为给某一种类型临时添加了一个方法。上图中的Int类型本来是没有
squareFun这个方法的,但是33行的定义临时给他增加了一个squareFun方法。
现在在看repositories方法,其实就是临时给
RepositoryHandler类型的变量repositories临时添加了一个方法configuration,当调用configuration时候就执行你写的mavenCentral()这行代码。
kotlin语法太灵活了,不明白的话,可以理解为,gradle的配置文件就是这样写的,只是格式比较特殊,就当它是maven中xml一样就行了。
有了上述的理解之后,就很容易明白,gradle就是借助于groovy、kotlin这样非常灵活的语言,让你通过写代码的方式完成整个构建脚本配置的编写。这也是gradle非常灵活的原因,其中
tasks.create("shi") {
shouldRunAfter("compile")
description = "shit"
println(project.projectDir)
val a = Runtime.getRuntime().exec(arrayOf("git", "rev-parse", "HEAD"))
a.waitFor()
val version = String(a.inputStream.readAllBytes())
//file 函数自动从当前工程的工作目录开始
val file = file( "src/main/resources/version")
file.writeBytes(version.toByteArray())
}
上面几行简短的代码,就实现了在编译代码之后,将git版本信息注入到jar包中,想要在maven中实现上面的逻辑,可能要费不少功夫。
gradle的执行流程(猜测,没有看过源码)
- gradle根据当前目录的一些配置文件如settings.gradle、gradle.properties等初始化Project对象
- 调用build.gradle.kts修改Project对象的相关属性,同时生成相应task的执行依赖关系
- 执行一系列相关的task,结束
总结
- gradle 本质上是用代码来替代传统的配置文件,因此灵活性非常之高,毕竟代码里面啥都能写
- gradle的核心概念并不复杂,只是大部分java程序员不太了解groovy和kotlin,很容易被劝退
- gradle灵活强大,可以说是未来的趋势,建议大家多多了解