首页 > 其他分享 >Gradle基础知识-Wrapper,Daeman;Groovy闭包语法

Gradle基础知识-Wrapper,Daeman;Groovy闭包语法

时间:2022-10-20 23:07:14浏览次数:55  
标签:Groovy 闭包 daemon 调用 启动 Daeman gradle JVM

gradle descirbe:

gradle本质就是一个bin脚本,分为window和unix。

启动gradle:启动jvm加载lib所需的库

gradle wrapper

输入gradle wrapper命令会在当前目录创建安装一个jar包(用于下载真正的gradle descirbe,jar很小)和脚本:

gradle wrapper命令(简称gradlew,每个gradlew都和一个具体的gardle版本绑定)会启动一个很小的jvm,加载gradlewrapper.jar判断当前文件夹是否存在对应版本的gradle如果没有则去下载对应版本的gradle(gradle的bin包)

gradleUserHome

缓存不同版本的Gradle的缓存文件

gradle doman:

Maven构建流程:

启动JVM然后执行加载jar包任务执行完任务完之后就销毁掉,下次再次构建的话还是一样的流程,由于JVM被销毁掉了,需要重新加载启动JVM然后重新加载jar包。所以速度很慢

gradle构建的做法:

启动一个client 的JVM(很小,因为只是做一个请求中转接受数据结果操作)然后client启动一个daemon JVM,DomanJVM加载jar包然后接受client JVM的请求做处理,处理完成后告知client JVM结果及日志; 当执行完成之后clie ntJVM 会被销毁。

下次执行构建的时候只需创建client JVM和damon JVM通信就行 由于但是daemon不会销毁,其中会缓存上次加载过的jar,有了缓存自然速度会快。

每次构建的时候相比maven的冷启动,gradle的热启动会快很多,doamen三个小时没有接受请求会自动退出。默认这个doman会开启,但是daemon并不是所有时候都会开启(需要兼容client JVM ,当不匹配时client会启动一个新的daemon)。

构建的时候可以指定--no-daemon参数,那么这个daemon每次构建完就会和maven一样销毁。(gradle3.0之前需要使用这个参数,现在已经很稳定了不需要这个参数了)

daemon进程

通过命令查看启动的daemon进程 : gradle --status查找运行的daemon进程

INFO是gradle的版本号

Daemon什么时候会失效需要重新启动

  • 修改 JVM 配置这回造成启动新的构建进程
  • Gradle 将杀死任何闲置了3小时或更长时间的守护程序
  • 一些环境变量的变化,如语言、keystore、keyStorePassword、keyStoreType 这些变化都会造成旧有的守护进程失效

完整流程:

  • 使用gradlew 启动一个gradle Task:启动一个轻量JVM。查找是否安装有对应版本的gradle,如果没有就启动wrapper进程先去下载(会下载到gradle userhome中),有就是下一步
  • 查找gradle对应版本并且和当前构建所要求的相关的参数所兼容的daemon JVM进程,如果没有找到就启动daemon JVM,如果找到就连接(使用socket)daemon

gradle daemon stared:第一次启动daemon

  • 将当前任务和所需的上下文(当前环境变量等)给到daemon执行

groovy语法介绍

运行在JVM上的脚本语言,强类型动态调用的

动态调用

默认Goovy是动态调用,如果加上@CommonStatic注解的话那么这段代码会像java一样进行静态编译并进行静态检查

构造方法及方法调用

Groovy的类会对其内部的所有全局变量生成一个map注入到构造方法中。

例如A类有一个a全局变量,创建A类的时候可以这样写 new A([a:1]),【】可以省略掉,new A(a:1)

java方法的调用字节码是invokednamic,但是Groovy调用方法是通过MOP反射:创建出对象后调用invokeMethod调用

闭包

闭包是groovy的核心。

最后一个语句是返回值,使用{}内部来定义方法。

声明闭包:def closure={it+1} 闭包就可以理解为方法,闭包可作为参数传递

it是默认参数如果指定参数名称就需要加上一句param->

调用闭包:print(closure(2)),和普通方法调用一样(可以将括号省略掉:方法名 空格 参数调用闭包);闭包是最后一个参数时,可以不在括号里面提取到外面

举例剖析:

plugins {
    id 'com.android.application' version '7.2.0' apply false
}

等价于

举例剖析:

    plugins( {
        id ('com.android.application'). version ('7.2.0'). apply( false)
    })

可以看到是调用plugins方法,这个方法的参数是一个闭包因此可以省略掉括号提取到外面;参数类型可以不用往()里面写,方法的调用也是通过空格分割开。

PluginDependencySpec id(String var1); 调用id传入string返回PluginDependencySpec 类

public interface PluginDependencySpec {

PluginDependencySpec version(@Nullable String var1);

PluginDependencySpec apply(boolean var1);

}

version返回的这个类又有两个方法再次调用,也就是上面说的:

version "" apply false

标签:Groovy,闭包,daemon,调用,启动,Daeman,gradle,JVM
From: https://blog.51cto.com/u_14689064/5780618

相关文章

  • 使用 Kotlin , Groovy ,Java 开发一个自己的 Gradle 插件
    使用Kotlin,Groovy,Java开发一个自己的Gradle插件先上效果图:image.png功能说明:korGenerate:自动生成Entity,Dao,Controller模板代码korFront:自动cop......
  • 8_闭包和装饰器
    1.回顾函数知识点:函数定义格式:def函数名(形参):pass函数注意事项:1:先定义再调用2:每调用一次执行一次3:函数不调用不执行4:函数如果没有return返回值,......
  • Groovy
    介绍闭包闭包是可以引用外部上下文的一系列语句。可以将闭包赋值给一个变量,并在稍候执行。每个闭包都有一个返回值,默认的返回值就是闭包最后一行语句的结果。函数必须......
  • 闭包函数
    目录闭包函数一、基础知识二、作用闭包函数一、基础知识所谓闭包函数就是定义在函数内部的函数,但是他有一些限制条件:1、定义在函数内部2、用到了外部函数名称空间中......
  • 在考虑闭包的情况下JS变量存储在栈与堆的区分
    变量存储在闭包中的问题按照常理来说栈中数据在函数执行结束后就会被销毁,那么 ​​JavaScript​​ 中函数闭包该如何实现,先简单来个闭包:functioncount(){letnum=......
  • L04-01. 闭包函数
    一.什么是闭包1.闭包由一个函数和该函数会访问到的非局部变量(upvalue)组成的,其中非局部变量(upvalue)是指不是在局部作用范围内定义的一个变量,但同时又不是一个全......
  • JavaScript闭包的深入理解
    闭包算是javascript中一个比较难理解的概念,想要深入理解闭包的原理,首先需要搞清楚其他几个概念:一、栈内存和堆内存学过C/C++的同学可能知道,计算机系统将内存分为栈和堆两部......
  • python(闭包函数与装饰器)
    今日内容概要global与nonlocal函数名的多种用法闭包函数装饰器简洁介无参装饰器装饰器模板装饰器语法糖及修复技术global和nonlocalmoney=666......
  • 闭包函数与装饰器
    global与nonlocal'''global'''money=666defindex(): globalmoneymoney=100index()print(money)"""局部名称空间直接修改全局名称空......
  • 闭包函数与装饰器
    闭包函数与装饰器目录闭包函数与装饰器一、global与nonlocal二、函数名的多种用法三、闭包函数四、装饰器简介五、装饰器推导流程六、装饰器模板七、装饰器语法糖八、作业......