Gradle 入门基础一
Gradle 生命周期
具体职责如下:
![](https://static001.geekbang.org/infoq/c8/c8909ccc431461ed064c98d891802c1a.png)
Initialization
阶段主要目的是初始化构建, 它又分为两个子过程,一个是执行 Init Script,另一个是执行 Setting Script。init.gradle
文件会在每个项目 build 之前被调用,用于做一些初始化的操作,它主要有如下作用:配置内部的仓库信息(如公司的 maven 仓库信息);
配置一些全局属性;
配置用户名及密码信息(如公司仓库的用户名和密码信息)。
Setting Script
则更重要, 它初始化了一次构建所参与的所有模块。Configuration
阶段:这个阶段开始加载项目中所有模块的 Build Script。所谓 "加载" 就是执行
build.gradle
中的语句, 根据脚本代码创建对应的 task, 最终根据所有 task 生成由 Task 组成的有向无环图(Directed Acyclic Graphs),如下:
![](https://static001.geekbang.org/infoq/8e/8e855c8e41f76bef0b08af7a6e1d0dcd.png)
从而构成如下有向无环树:
![](https://static001.geekbang.org/infoq/ae/aeff0fbfd2449a7422f4731f2a5806fe.png)
Execution 阶段:这个阶段会根据上个阶段构建好的有向无环图,按着顺序执行 Task【Action 动作】
Setting 文件
主要作用:
主要是在项目初始化阶段确定一下引入哪些工程需要加入到项目构建中,为构建项目工程树做准备。
工程树:gradle 中有工程树的概念,类似于 maven 中的 project 与 module。
内容:
里面主要定义了当前 gradle 项目及子 project 的项目名称
必须放在根工程目录下,并且有且只有一个 settings 文件
为
settings.gradle
文件,名字不能发生变化对应实例:与 org.gradle.api.initialization.Settings 实例是一一对应的关系。每个项目只有一个 settings 文件。
作为开发者我们只需要关注该文件中的 include 方法即可。使用相对路径【 : 】引入子工程。
一个子工程只有在 setting 文件中配置了才会被 gradle 识别,这样在构建的时候才会被包含进去。案例如下所示:
项目名称中 ":" 代表项目的分隔符, 类似路径中的 "/". 如果**以 ":" 开头则表示相对于 root project。**然后 Gradle 会为每个带有 build.gradle 脚本文件的工程构建一个与之对应的 Project 对象。
Gradle 对测试的支持
Junit 的使用
Gradle 对 Junit 4 的支持
Gradle 对 Junit 5 的支持
包含和排除特定测试
Task
目实质上是 Task 对象的集合。一个 Task 表示一个逻辑上较为独立的执行过程,比如编译 Java 源代码,拷贝文件, 打包 Jar 文件,甚至可以是执行一个系统命令。另外,一个 Task 可以读取和设置 Project 的 Property 以完成特定的操作。
官方文档:https://docs.gradle.org/current/userguide/tutorial_using_tasks.html
demo:
如何区分任务的配置段和任务的行为:
任务的配置段在配置阶段执行,任务的行为在执行阶段执行
任务的行为
底层原理分析
无论是定义任务自身的 action,还是添加的 doLast、doFirst 方法,其实底层都被放入到一个 Action 的 List 中了,最初这个 action List 是空的,当我们设置了 action【任务自身的行为】,它先将 action 添加到列表中,此时列表中只有一个 action,后续执行 doFirst 的时候 doFirst 在 action 前面添加,执行 doLast 的时候 doLast 在 action 后面添加。doFirst 永远添加在 actions List 的第一位,保证添加的 Action 在现有的 action List 元素的最前面;doLast 永远都是在 action List 末尾添加,保证其添加的 Action 在现有的 action List 元素的最后面。一个往前面添加,一个往后面添加,最后这个 action List 就按顺序形成了 doFirst、doSelf、doLast 三部分的 Actions,就达到 doFirst、doSelf、doLast 三部分的 Actions 顺序执行的目的。
提示 1:其中<<代表 doLast,在 gradle5.x 版本之后就废弃,不能使用了,如下所示:
常用命令
![](https://static001.geekbang.org/infoq/c2/c21c73bd302ac3956165cc7e2a76d039.png)
详细命令可参考官方文档:https://docs.gradle.org/current/userguide/command_line_interface.html
拓展:
gradle 任务名是缩写: 任务名支持驼峰式命名风格的任务名缩写,如:connectTask 简写为:cT,执行任务 gradle cT。
前面提到的 Gradle 指令本质:一个个的 task[任务], Gradle 中所有操作都是基于任务完成的。
gradle 默认各指令之间相互的依赖关系:
![](https://static001.geekbang.org/infoq/a8/a82da99dfa301a27fe49ef106cd8a8e6.png)
图中相关命令的解释:
![](https://static001.geekbang.org/infoq/fa/fa20dc35a92fbc7955b81c8203586b43.png)
task 的定义方式
一种是通过 Project 中的 task()方法,另一种是通过 tasks 对象的 create 或者 register 方法。
Task 的属性
demo:
![](https://static001.geekbang.org/infoq/b0/b0405a07b6226a774a45f2b74ee56cd4.png)
Task 的类型
参看官方地址:https://docs.gradle.org/current/dsl/index.html
![](https://static001.geekbang.org/infoq/3b/3b2a9eebefbcf1dc1f97586e4bea233c.png)
整理不易。欢迎点赞关注
微信搜索【码上遇见你】获取 Java 学习资料。获取更多精彩内容。
评论