[简记]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生命周期

生命周期

  1. Initialization
    初始化阶段,支持单项目与多项目构建。决定哪些项目参与构建
  2. Configuration
    对构建进行配置,实际是将build.gradle从头执行到尾等等
  3. Execution
    执行阶段,gradle执行相关任务

举例

configuration阶段与executing阶段演示
  1. 在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中使用依赖项目中的类或方法或者插件

  1. 根目录下的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);	
		}
	} 
}
  1. build.gradle中使用插件
apply plugin: MyPlugin

参考

1.