Gradle与Maven的区别
对于Maven而言,它的生命周期是连续的,我们可以在它的任意阶段绑定插件执行相应的动作,它的声明依赖操作都是基于pom文件进行的。
对于Gradle,相比于Maven而言,它增加了更多的灵活性,它的语法是基于Groovy和Ktlin的领域专属语言 (Domain Specific Language) ,他的基本执行单位是Task,在执行操作的时候,可以指定Task运行,而不是像Maven,指定某个阶段,之前的阶段必须全部运行。
Gradle基本概念
1.Gradle的Distribution
和Maven以及任何的构建工具一样,Gradle的Distribution也是基于两个点,脚本和lib。
2.Gradle的wrapper
当我们在本地编译好自己的代码,运行测试都通过的时候,在发布到服务端的时候,经常会因为构建工具的版本不相同而报错,在Gradle中提供了一种方式即wrapper,即gradlew。它的作用是,当运行gradlew,在执行构建之前,会检查运行的环境有没有规定的执行版本,没有的话则下载对应的版本。
3.Daemon
Gradle的Daemon是一个使用内存换取效率的典型,官方推荐是无条件打开的,Daemon可以认为它在内存中启动了一个JVM,当我们运行Gradle启动命令的时候,其实Gradle进程只是通知Daemon去运行指定的执行任务,并且Daemon会缓存所运行的结果,若是这样执行重复的任务,效率会很高。
Gradle的核心概念
1.Project
一个bulid.gradle对应一个Project对象,可以类比Maven中一个pom文件对应一个子模块。
2.build.gradle
构建脚本,我理解中就是类似于Java中的一个.java
文件,用来执行Gradle的任务。
3.Task
构建脚本中最小的执行单元,任务之间可以做类似于Java方法的多种操作。任务之间可以依赖,可以动态创建。
Gradle的生命周期
1.初始化
指的是加载setting.gradle中的指令
2.配置项目
从上到下去build.gradle中配置相应的任务,会先把任务进行初始化,但是并不会执行doLast
块中的语句。
3.执行选中的任务
通过命令行指定要执行的任务。
使用Task
1.简单的Task
Task的语法是依赖Groovy
来写的,在其中会使用大量的闭包等类似于魔法般的操作,充斥着相当多的语法糖,所以Gradle相对于Maven而言,学习门槛也比较高。
举例说明,在build.gradle
中写一个Task
task aaa{
doLast{
println "hello aaa"
}
}
然后执行gradlew aaa
,控制台就会打印出“hello aaa”。Task是Gradle中最小的工作单元。
2.Task中的依赖
task bbb{
dependsOn(aaa)
doLast{
println "hello bbb"
}
}
如果我们执行bbb的话,会发现aaa也会被执行。注意Gradle会按照build.gradle中的顺序初始化任务,被依赖的任务不能放在后面。
所以Gradle也提供了afterEvaluate
钩子方法
project.afterEvaluate{
print "afterEvaluate running .."
}
这样就会出现如下的运行结果

当然,Gradle也可以完成很多灵活的创建功能,比如:
many.toInteger().times{
index-> task "task$index"{
doLast{ println index }
}
}
> Task :task100
100
然后运行gradlew task100 -Pmany=101
,通过给many传参,可以灵活的运行任务。
网友评论