[简记]Gradle使用与介绍
gradle介绍
流程
gradle启动类似cs架构(这点类似docker),每次gradle启动时会检测是否已经启动Daemon Jvm,若没有启动则启动一个Daemon,已经存在则会链接上Daemon。通过这种方式能够在后续的编译过程中减少启动jvm的时间,相比maven每次编译时启动并初始化相应的一个jvm时间消耗会减少。
如果你使用idea查看build输出窗口或者直接使用gradle,在第一次执行时会有类似以下输出内容:
Starting Gradle Daemon...
Gradle Daemon started in 757 ms
gradle的本质是将lifecycle与很多api的结合完成一系列的事情。
当然这种模式也可以通过运行参数--no-Daemon指定不使用Daemon
语言
gradle使用的语言是groovy。groovy是运行在jvm上的脚本语言, groove语言兼容java编码。相关介绍推荐阅读《Groovy In Action2》。
groovy简介
//列表
List list = []
List list1 = [1,2,3,4]
List result = []
for(int e : list1) {
if(e % 2 != 0) {
result.add(e)
}
}
list.stram().filter().collect()
//键值对
Map map = [a : 1]
//使用类
new A(a: 1).pringA()
//闭包
def closure() {p -> p*2}
println closure(3)
具体其他参考官网说明groovy-documentation.
在gradle中大量使用了groovy闭包的语法方式,其project是gradle的api核心。
gradle生命周期
生命周期
- Initialization
初始化阶段,支持单项目与多项目构建。决定哪些项目参与构建 - Configuration
对构建进行配置,实际是将build.gradle从头执行到尾等等 - Execution
执行阶段,gradle执行相关任务
举例
configuration阶段与executing阶段演示
- 在build.gradle中新增一个闭包如下,以下语句将会在configuration阶段输出configure,在Execution阶段输出Executing task。因为println('configure')是在configuration阶段被直接运行的task('helloworld')。gradle中的task的doLast闭包放在task执行列表最后但并不真正执行。
//一个名为helloword的task
task('helloworld', {
println('my configure')
doLast() {
println('my executing task')
}
})
命令行执行,触发构建过程
gradle help
输出内容
> Configure project :
my configure
> Task :help
Welcome to Gradle 6.8.3.
gradle核心模型
project
project可以看作是gradle的实例,其地位非常重要,是一切无主方法的来源。
project支持多模块且多级结构,通过对应的api能获取到对应的内容,如:
project.parent.childProjects
task
gradle task是动态的可以在configuration动态生成,也可以是已有的。如下动态生成task
//以下3种for循环结果是一样的
//(0..<10).each{ i->
//10.times { i ->
for(int i = 0;i < 10; i++) {
task('task' + i) {
def capturedI = i
doLast{
println("my executing task ${capturedI}")
}
}
}
运行后,会新增10个task,每个task的doLast输出my executing task $
使用
构建wrapper
构建wrapper能够为当前目录绑定gradle版本,当当前项目在别处使用时能够保证其使用的gradle版本一致或兼容的版本。
gradle wrapper
使用上述命令后会在目录下生成。其本质上是引入了一个小量的jar包,并且生成脚本。在别处执行脚本时会启动相应的jar包,并检测当前环境是否存在gradle,若没有则从网上下载。
├── gradle
│ └── wrapper
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── gradlew
└── gradlew.bat
基本的build.gradle
apply plugin: 'java'
repositories {
mavenCentral()
}
denpendencies {
compile 'jar包'
}
插件
简单的例子
如下方式写一个插件并使用它
class MyPlugin implements Plugin<Project> {
@Override
void apply(Project project) {
for(int i = 0;i < 10; i++) {
task('task' + i) {
def capturedI = i
doLast{
println("my executing task ${capturedI}")
}
}
}
}
}
apply plugin: MyPlugin
通过url获取插件
apply plugin: 'http://www.myserver.com/plugin/my-script'
build.gradle中使用依赖包中的类或方法
import com.example.package;
//可以在gradle中使用jar包中的plugin
apply plugin: MyPlugin
//gradle中使用jar包中的方法
if(Example.example()) {
}
denpendencies {
classpath 'jar包'
}
build.gradle中使用依赖项目中的类或方法或者插件
- 根目录下的buildSrc文件夹下
buildSrc/src/main/java文件夹下编写类
MyPlugin.java
import org.gradle.api.Plugin;
import org.gradle.api.Project;
public class MyPlugin implements Plugin<Project> {
@Override
public void apply(Project project) {
for(int i = 0; i < 10; i++) {
project.task("task" + i);
}
}
}
- build.gradle中使用插件
apply plugin: MyPlugin