一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第4天,点击查看活动详情。
Gradle是一个项目管理工具,比Ant和Maven更加高效.
Gradle的开发语言是Groovy,Groovy是一个新的编程语言,兼容Java.Gradle不仅仅可以用于Java,也可以用于Groovy和Scala,这也是它和Maven的区别之一.
官网地址: gradle.org/
全部版本下载地址: services.gradle.org/distributio… (官网下载的是all的版本,可以下载bin的版本)
安装配置
安装配置较为简单,官网下载最新版本Gradle,解压后配置环境变量即可
下载安装
下载地址: gradle.org/releases/ 目前最新版为7.4.1
下载后解压到一个目录即可
配置环境变量
- 新建GRADE_HOME环境变量,指向解压目录
- 修改PATH环境变量,追加GRADLE_HOME\bin目录
这里可以写绝对路径,也可以写为%GRADLE_HOME%\bin,这样写的好处是,如果GRADLE_HOME的路径变了,不用修改多处.
其实配置环境变量的作用就在于你可以在任意地方打开命令行使用gradle命令,实际开发过程中其实都是配合ide使用,这个作用不大.
IDEA配置
主要配置下我们安装的Gradle目录,否则idea会使用默认版本
选择本地安装的gradle即可
Groovy简单语法
gradle配置文件使用的是Groovy语法,所以需要熟悉一下简单的Groovy语法
简单的输出,变量赋值,集合等语法如下
// 输出
println 123
// 变量 弱类型 类似ptyhon 直接定义即可 不用指定变量类型
def str = "123"
println str
// 集合
def list = [1,2,3]
println list
// 添加元素
list.add(4)
println list
// map
def map = ["1":"1"]
// 添加元素
//map.key2 = "2"
map.put("2","2")
println map
闭包
闭包是看懂grade配置文件的关键,可以理解为grade配置文件引入jar包的语法都是闭包
闭包类型: Closure 这是Groovy中的一个语法
\
闭包可以理解为把方法作为参数传递给另外一个方法.
// 闭包函数
def param = {
println 123
}
// 调用函数
// Closure就是groovy中的闭包类型
def callMethod(Closure closure){
closure()
}
// 调用
callMethod(param)
如上所示,就是在把param这块代码当作参数传递给callMethod方法.
// 给闭包函数增加一个参数v
def param = {
v ->
println("hello ${v}")
}
// 调用该闭包函数时也需要传递参数
def callMethod(Closure closure) {
closure("world")
}
// 调用
callMethod(param)
闭包函数也可以携带参数.
\
同时也可以直接将闭包参数放入调用方法内 如下:
// 调用该闭包函数时也需要传递参数
def callMethod(Closure closure) {
closure("world")
}
// 调用
callMethod{ v ->println("hello ${v}")}
举例gradle的配置文件
dependencies {
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.7.0'
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.7.0'
}
这就是一个调用方法dependencies,传入闭包类型的参数
\
Gradle结构
在gradle的下载地址里可以看到gradle分为三种
- all 完整版本
- docs 文档
- bin 简略版本 相当于完整版删除了文档,只留下可执行文件
- src 源码包
我们一般使用简略版本即可,功能无变化,体积缩小
我们来看下解压后的gradle项目结构
bin目录: 放的是可执行文件,内部只有两个文件,其实是一个文件,针对linux和windows的不同版本,这个文件的作用就是来启动一个jvm,运行Gradle
init.d目录: 存放初始化的一些东西,当gradle启动的时候会执行这里的配置,比如我们配置本地仓库,代理仓库时都可以配置在这里
lib目录: 这是gradle运行所需要的一些jar包,一般不需要改
下面的三个文件就是Gradle的一些说明.
再来看下一个gradle项目的结构
Gradle项目结构
如上目录
- .gradle目录 gradle的执行相关信息
- gradle目录 里面存放的是wrapper
- src目录 存放源代码
- build.gradle文件 gradle的构建脚本,根据此文件中的脚本来执行构建过程
- gradlew文件 gradle在Linux的执行脚本
- gradlew.bat gradle在window下的执行脚本
- settings.gradle 多模块项目依赖关系配置文件
wrapper
简单理解下gradle wrapper的作用.
首先要了解的是,gradle有很多版本,不同的项目的编译版本可能不一样,就像java的版本也有很多一样.
而不同版本的gradle编译结果很可能出现不能预料的错误
那么我们就需要保证别人拿到我们的gradle项目时,使用的gradle版本要跟我们开发时使用的一致.
这就是wrapper的作用.
当项目下有wrapper的时候,gradle会优先下载wrapper中的gradle的版本来作为编译版本.
这样我们就能保证项目在不同环境下的编译版本保持一致.
Gradle简单原理
gradle是一个基于jvm运行的项目管理工具,也就是说他的底层还是jvm.
相较于maven来说,他的效率更高,使用daemon的方式来创建运行环境
daemon
gradle使用守护进程来构建项目,加快构建的速度
以Maven来说,构建项目本质上就是启动了一个jvm,然后加载项目的依赖jar包,然后执行构建的操作,构建完成后销毁jvm,下次构建,重复这个过程.
而jvm的启动及加载都是比较耗费资源的
所以gradle有了一个新的方法,每次创建完jvm执行完构建操作后不进行关闭,而是以守护进程的方式存在,这样在下次构建时就可以继续使用这个守护线程的jvm进行构建,这样就避免了jvm的重复启动及加载. 这是一种热启动的方式.
bin目录下的gradle文件就是用来启动一个jvm,这个jvm不负责构建,而是作为一个客户端来创建/查询deamon,并与存在的deamon进行交互.
所以我们就可以得出gradle的构建操作:
- 发出构建指令(gradle build)
- bin目录下的gradle脚本创建一个客户端jvm
- 客户端jvm根据构建的参数(最大内存最小内存等参数)查询是否存在符合要求的deamon jvm
-
- 如果deamon不存在或者没有符合要求的deamon,则开始创建一个deamon
- 如果deamon存在,直接使用该deamon的jvm进行构建操作.
deamon属于使用一部分额外空间换取时间的操作,gradle使用守护线程的方式加快构建的速度,其实就是节省了创建jvm,加载jar包的一部分时间.
deamon也不会一直存在,如果三个小时内该deamon没有使用过,则会销毁.
gradle3.0之后就默认会使用deamon来构建,也可以使用参数 --no-deamon来强制不使用deamon,那样就是类maven的方式来构建.