Gradle构建框架
前面我们已经简单学习了Groovy语言,我们知道Gradle工程的配置文件语法其实就是Groovy的配置脚本,Gradle构建工程时会调用这些配置脚本,脚本又调用Gradle提供的API,最终实现可配置的构建流程。这篇笔记我们详细学习Gradle框架提供的各种功能。
工程构建生命周期
Gradle中,工程构建生命周期分为3部分:
Initializing:初始化阶段,从Gradle全局配置和工程中的settings.gradle等处,加载全局属性、仓库信息、模块信息等。
Configuration:按依赖顺序依次处理各工程模块,根据build.gradle生成task。
Execution:根据task执行具体的构建逻辑。
settings.gradle
settings.gradle配置文件放置在工程根目录下,用于在Initializing阶段指定工程中的模块信息,包括当前模块和子模块。下面例子中,我们的父工程是demo,拥有两个子模块user和order。
rootProject.name = 'demo'
include 'user'
include 'order'
通常来说,我们的模块文件夹名就是模块名,例如demo/user文件夹就是demo模块的user子模块,当然这并不是必须的,但推荐这样做。
注:如果子模块还有子模块,可以用冒号分隔,例如include 'proj:subproj'。
build.gradle
build.gradle中包含和具体构建相关的配置脚本。其中主要包含如下几大块配置:
group和version:模块的组名和版本号plugins {}:插件repositories {}:依赖仓库dependencies {}:具体依赖项
除此之外,具体到工程中,我们使用的插件也会引入一些可配置项,比如java插件会额外引入sourceCompatibility、targetCompatibility来指定编译和运行兼容的JDK版本。
Task 构建任务
Task可以理解为构建过程中的一个具体环节,比如代码编译、拷贝资源文件等,我们使用Gradle其实就是调用其中的各种Task。
Gradle框架本身只包含一些基本的Task,而编译任务等由java等插件具体实现。除了自带Task和插件Task,我们也可以定义自己的Task。
查看当前有哪些Task可用
当然,Eclipse等IDE会给我们以图形界面方式列出哪些Task可用。不过实际上Gradle命令行也对这类功能有着完善的支持,如下命令可以列出当前模块可以执行哪些Task(不包括父子模块)。
gradle tasks
--all:该参数可以查看所有任务(包括父子模块)
调用Task
调用Task比较简单,也是最常用的命令,比如我们很常用的构建工程gradle build,编译Java代码gradle classes等,其通用格式如下。
gradle <task1名> <task2名> ...
参数可以接任意个Task按顺序执行。
自定义Task
我们可以直接在build.gradle中定义我们自己的Task。自定义Task例子如下。
task A {
// 配置阶段
println 'task A configure'
doFirst {
// 执行阶段
println 'task A do first'
}
doLast {
// 执行阶段
println 'task A do last'
}
}
其中代码分为3部分,最外层的被称为配置阶段,配置阶段在所有Task真正执行前执行;而执行阶段又分为doFirst和doLast,前者会先执行。
Task依赖
Task依赖表示一个任务要想执行,必须依赖另一个任务先执行的结果,比如打包一定要在编译后执行。定义任务依赖写法如下。
task A {
doFirst {
println 'task A'
}
}
task B(dependsOn: [A]) {
doFirst {
println 'task B'
}
}
注意:依赖树中重复的依赖只会执行1次。
Task分组和描述
Task有分组属性,之前我们执行gradle tasks就可以观察到分组显示的Task,如果自定义Task没有指定该属性,默认属于other分组,除了分组,我们还可以给Task指定描述。下面是一个例子。
task A {
group 'my group'
description 'This is my demo task'
doFirst {
println 'task A'
}
}
Plugin 插件
Gradle本身只提供了一个框架,具体构建Java工程或是其它类型的工程,以及自动化的打包、发布等,都是通过插件的形式实现的。比如构建Java工程需要java插件,JavaWeb工程额外还需要war插件。Gradle相比Maven的一大优势就是灵活性,我们也很容易编写自己的插件。
Gradle插件可以分为核心插件和第三方插件,我们可以在官方文档中找到所有的核心插件列表。我们Java开发中常用的大部分功能核心插件都已经包含了,比如很常用的java、war、application插件等,build.gradle中引入核心插件。
plugins {
id 'java'
id 'war'
}
除了核心插件,Gradle还维护了第三方插件的插件仓库:https://plugins.gradle.org/
build.gradle中引入第三方插件。
plugins {
id 'com.jfrog.bintray' version '1.8.5'
}
对于具体某一个插件有哪些配置、哪些Task,这里就不过多描述了,具体可以参考相关文档。