DSL(Domain Specific Language)领域特定语言,就是专门为一个领域定制的语言。Gradle就是一门DSL,他是基于Groovy的。
1.window上安装gradle,下载gradle,解压后将bin目录配置到path路径中。
2.创建build.gradle文件。
task hello{
doLast{
println "hello"
logger.quiet("rizhi")
logger.error("error")
logger.info("info")
logger.debug("debug")
}
}
执行命令gradle -q hello
doLast表示在task执行完后开始执行这部分闭包代码。
3.wrapper表示对Gradle的包裹,目的是使开发过程中统一使用Gradle构建的版本,避免版本不统一。
gradle wrapper就能生成可执行的脚本
可以用以下命令指定gradle的版本
gradle wrapper --gradle-version 5.2.1
4.gradle的日志有6级
ERROR
QUIET 重要消息 -q
WARNING
LIFECYCLE 进度消息
INFO -i
DEBUG -d
使用
gradle -s 表示输出关键堆栈信息
gradle -S 表示输出全部堆栈信息
可以自定义的日志信息
logger.quiet("quiet")
5.获取帮助
gradlew -?
或gradlew -h
或gradlew -help
使用gradlew tasks获取所有的task
gradlew tasks --all
强制刷新gradle的依赖,assemble是集合的意思。
gradlew --refresh-dependences assemble
6.字符串
task printStringvar{
def name ="涨"
println '单引号:${name}'
println "双引号:${name}" //双引号支持模板字符串,但是单引号不支持
}
7.List的使用
task printList{
def numList=[1,2,4,5]
println numList.getClass().name //ArrayList
println numList[-1] //最后一个元素
println numList[1] //第一个元素
println numList[1..3] //从第二个到第四个元素
//遍历
numList.each{
println it
}
}
8.Map的使用
task printMap{
def map=["width":1024,"height":768]
println map.getClass().name //LinkedHashMap
println map["width"] //两种获取值的方式
println map.height
map.each{
println "key:${it.key},value:${it.value}"
}
}
9.方法
task invokeMethod{
method(1,2)
method 1,2 //能省略括号
println "${method1(1,3)}"
println "${method2(1,3)}"
}
def method(int a ,int b){
println a+b
}
def method1(int a ,int b){
return a+b
}
def method2(int a ,int b){
a+b //可以省略return ,这样默认返回的是最后一行
}
10.遍历方法的各种写法
println "第一种"
//遍历
numList.each{
println it
}
println "第二种"
numList.each({
println it
})
println "第三种"
numList.each(){
println it
}
11.JavaBean的使用
task helloJavaBean{
Person p =new Person()
println "名字:${p.name}"
p.name="涨" //可以赋值
println "名字:${p.name}"
//只定义了get方法,这样就能直接获取使用
println "名字:${p.age}"
}
class Person{
//不需要借助get set方法,默认就实现了这些
private String name;
//只定义了age的get方法,但是不能进行修改age
public int getAge(){
12
}
}
12.自定义闭包
task helloClosure{
customEach{
println it
}
}
//自定义闭包,只有一个参数,就是接受代码块
def customEach(closure){
for(int i in 1..10){
closure(i)
}
}
向闭包中传递参数
task helloClosure1{
//当闭包有一个参数时,默认是it,当有多个参数的时候,就不能用it,需要把参数一一列出
eachMap{k,v->
println "${k} is ${v}"
}
}
def eachMap(closure){
def map=["name":"涨","age":12]
map.each{
closure(it.key,it.value)
}
}
13.闭包委托
Groovy的闭包有thisObject,owner,delegate三个属性。当在闭包中调用方法时,由他们确定使用哪个对象来处理。
默认情况下delegate和owner是相等的,但是delegate是可以被改变的。
static def person1(Closure<Person1> closure) {
Person1 p = new Person1()
//可以指定代理,修改delegate。也可以直接用传参的形式,相当于把it传递过去
//closure.delegate = p
//closure.setResolveStrategy(Closure.DELEGATE_FIRST)
closure(p)
//闭包委托
println "closure.thisObject="+closure.thisObject
println "closure.owner="+closure.owner
println "closure.delegate="+closure.delegate
println "closure.resolveStrategy="+closure.resolveStrategy
}
class Person1 {
String name
String age
def dumpPerson() {
println "name is ${name},age is ${age}"
}
}
task hello1 {
//这里的it就是指代对象
person1 {
it.name = "momo"
it.age = "18"
it.dumpPerson()
}
}