Gradle是新一代的自动化构建工具,升级版的Ant或Maven,Gradle可以完成Ant、Maven的所有工作,甚至整合Ant或Maven的功能。
虽然Android studio所采用的构建工具就是Gradle,简单了解一下。
Gradle的优势:
安装Gradle:
下载地址
https://services.gradle.org/distributions/

现在已经7.5.1了…
选择:
下载gradle - 7.5.1 - all .zip

解压到D盘根目录下


将bin路径添加到操作系统的PATH环境变量

测试是否安装成功

如果运行 gradle命令时没有指定任何参数,Gradle 会在当前目录下搜索build.gradle文件。如果找到了就以该文件作为构建文件,并执行指定任务。
要想让 Gradle使用其他构建文件,可以用–buildfile<构建文件>选项,
gradle -b a.xml //显示指定使用a.xml作为构建文件
gradle --buildfile b.xml //显示指定使用b.xml作为构建文件
如果希望 Gradle运行时只输出少量的必要信息,则可以使用–quiet或-q选项。如果运行Gradle时要显式指定希望运行的任务,则可以采用如下命令格式。
gradle [task1 [task2 [task3] ... ]]
使用Gradle 的关键就是编写构建文件,构建文件的主要作用就是定义构建项目的各种任务(Task)和属性,每个任务可包含多个动作(Action),Gradle每次运行时可运行一个或多个任务。
Gradle构建文件的默认名字为 build.gradle,也可以取其他名字。但如果为该构建文件起其他名字,则意味着要将这个文件名作为参数传给Gradle 工具。可以将构建文件放在项目的任何位置,但通常做法是放在项目的根目录中,这样有利于保持项目的简洁和清晰。
一个典型的Gradle项目层次结构:

我超,这不就是那啥…
如果使用 gradle命令构建过项目,那么在项目的根目录下会多出一个.gradle 文件夹,在该文件夹中存放的是Gradle的构建信息,一般不要手动去修改、删除它。
Gradle构建文件本质上是一个Groovy源文件,因此该文件的语法完全符合Groovy语法。
Gradle采用领域对象模型的概念来组织构建文件,在整个构建文件中涉及如下最核心的API:
project:代表项目,通常一份构建文件代表一个项目
TaskContainer:任务容器,每个project都会维护一个TaskContainer类型的tasks属性,即TaskContainer和project一一对应。
Task:代表 Gradle要执行的一个任务。Task 允许指定它依赖的任务、该任务的类型,也可通过configure()方法配置任务。它还提供了doFirst()、doLast()方法来添加 Action。 Action对象和 Closure对象都可代表 Action。
【Closure代表一个闭包,所以Action实际上就代表一个代码块】
Gradle构建文件结构:

为Gradle构建文件创建Task有如下常用方法:
Task属性:
举个栗子
使用idea创建一个gradle项目

等待项目构建完成

编辑build.gradle文件
//定义hello1任务
task hello1{
println "配置第一个任务"
}
使用gradle hello1命令执行

新知识get
很明显,输出语句并不是在运行阶段输出的,而是在配置阶段。
【Gradle的构建过程】
Gradle是一种声明式的构建工具,使用Gradle构建时,Gradle并不是直接按顺序执行 build.gradle文件中的内容的,Gradle的构建过程可分为两个阶段。
如果需要为Task添加Action,则可通过Task 的doFirst、doLast方法——正如它们的名字所暗示的,doFirst用于将Action添加在Action序列的前面, doLast用于将Action添加在Action序列的后面。
// 定义hello2任务,传入的代码块负责配置该任务
task hello2 {
println "配置第二个任务"
// 调用doLast方法为Task添加Action
doLast {
// 使用循环
for(i in 0..<5){
println i
}
}
// 调用doFrist方法为Task添加Action
doFirst {
// 定义变量
def s = "fkjava.org"
// 输出字符串模板
println "开始执行第二个任务:$s"
}
}
运行hello2任务

强强强,Gradle构建文件不是简单的XML配置,而是完全支持Groovy编程语言,一个构建文件就能拥有无限可能。
从执行过程可以清楚地看出 Gradle构建的配置和运行两个阶段。在配置阶段,Gradle会配置整个Project和所有Task,因此可以看到hello1、hello2两个 Task 的配置代码的执行过程;在运行阶段,则只看到执行hello2任务。从上面的执行结果可以看出,程序先执行doFirst方法添加的Action,再执行doLast方法添加的Action。
此外, Project对象还带一个TaskContainer类型的tasks属性,因此也可在构建文件中通过 tasks属性的create方法来创建Task。
// 调用Project的tasks属性(TaskContainer)的create方法来创建task
tasks.create(name: 'showTasks') {
doLast{
// 查看Project的tasks属性的类型
println "tasks属性的类型:${tasks.class}"
// 遍历tasks属性
tasks.each {e ->
println e
}
}
}
运行任务

在创建Task时可通过dependsOn属性指定该Task所依赖的Task,也可通过type指定该Task的类型——如果不指定type属性,Task 的默认类型是Gradle实现的DefaultTask类。
指定dependsOn和type属性:
//调用project的tasks属性的create方法创建Task
//dependsOn指定该Task依赖hello2,该Task的类型是Copy(文件拷贝)
tasks.create(name : 'fkTask',dependsOn:'hello2',type:Copy){
from 'books.xml'
into 'dist'
}
运行任务

由于fkTask任务依赖hello2,因此在执行 fkTask 任务之前会先执行hello2任务。命令执行完成后,可以看到项目根目录下的 books.xml文件被复制到dist目录下。
使用 Project的 task方法创建Task时也可指定 type、dependsOn属性,例如如下代码定义了compile和run两个任务。由于这两个任务分别为JavaCompile、JavaExec类型,因此该构建文件需要应用java插件。
创建主类

构建文件
// 应用名为'java'的插件,主要为了引入JavaCompile、JavaExec两个任务
apply plugin: 'java'
// 指定该任务的类型为JavaCompile
task compile(type: JavaCompile){
source = fileTree('src/main/java')
classpath = sourceSets.main.compileClasspath
destinationDir = file('build/classes/main')
options.fork = true
options.incremental = true
}
// 指定该任务的类型为JavaExec
task run(type: JavaExec, dependsOn: 'compile'){
classpath = sourceSets.main.runtimeClasspath
// 指定主类为lee.HelloWorld
main = 'dingjiaxiong.HelloWorld'
}
上面代码定义的compile任务的类型是JavaCompile(编译Java源程序的 Task
读者可通过Gradle的API文档查看关于该Task 的具体信息),在使用JavaCompile时需要通过 source指定源代码所在路径,通过 destinationDir指定编译后的字节码文件的保存位置,该任务的默认Action将会编译所有Java源文件。
上面run任务的类型是JavaExec(运行Java程序的Task,可通过 Gradle的API文档查看关于该Task 的具体信息),在使用JavaExec时需要通过main指定运行的主类。
为了看到Gradle编译、运行Java源代码的效果,应按Gradle的约定,将所有Java源文件放在src\mainljava目录下,并创建build路径作为构建目录。
使用gradle run命令运行
