Gradle(一) Gradle的简介及deamon

250 阅读6分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 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

下载后解压到一个目录即可

配置环境变量

  1. 新建GRADE_HOME环境变量,指向解压目录

  1. 修改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分为三种

  1. all 完整版本
  2. docs 文档
  1. bin 简略版本 相当于完整版删除了文档,只留下可执行文件
  2. 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的构建操作:

  1. 发出构建指令(gradle build)
  2. bin目录下的gradle脚本创建一个客户端jvm
  1. 客户端jvm根据构建的参数(最大内存最小内存等参数)查询是否存在符合要求的deamon jvm
    1. 如果deamon不存在或者没有符合要求的deamon,则开始创建一个deamon
    2. 如果deamon存在,直接使用该deamon的jvm进行构建操作.

deamon属于使用一部分额外空间换取时间的操作,gradle使用守护线程的方式加快构建的速度,其实就是节省了创建jvm,加载jar包的一部分时间.

deamon也不会一直存在,如果三个小时内该deamon没有使用过,则会销毁.

gradle3.0之后就默认会使用deamon来构建,也可以使用参数 --no-deamon来强制不使用deamon,那样就是类maven的方式来构建.