Gradle安装和配置
Gradle是Java开发中的一款项目自动化构建工具,相比Ant、Maven这两款比较传统的工具,Gradle最大的特点是抛弃了XML转而使用基于GroovyDSL的灵活构建配置脚本,目前Gradle应用广泛,它也是Android开发中的标准构建方式。
官方网站:https://gradle.org/
同类技术对比
Ant相对老旧,除非是历史遗留项目,目前已经极少使用了,Maven则仍是JavaEE工程构建的事实标准,Gradle由于诸多缺点不推荐在企业级应用构建中使用。Gradle适用于少数非JavaEE项目,这类工程可能需要灵活的非标准构建流程,使用Maven可能难以实现,此时Gradle可以发挥其作用。Android开发中,Gradle就是Google指定的唯一选择,无论你是否喜欢。
警告:虽然Gradle目前是Android开发中的标准构建方式,但值得注意的是Gradle仍是世界上最难用的构建系统,构建各种Java应用个人仍推荐首先尝试使用Maven,除非必要不要轻易碰Gradle,否则你绝对会吃不了兜着走。
Gradle的缺点
Gradle绝对不是一款“好用”的构建工具,反而它是我见过最难用的构建工具没有之一,你在决定学习Gradle之前一定要了解并确定你能忍受它。主要缺点包括:
- 学习成本极高:使用Gradle需要先了解相对小众的Groovy语言,否则会迷失在极度灵活的脚本中,陷入“怎么写都能编译,怎么运行都报错”的窘境!
- 兼容性极差:版本升级经常做出非兼容性修改(Breaking-Changes),不仅要不断按最新标准修改工程构建脚本,还要认真检查JDK、IDE工具、Gradle之间的版本是否兼容。这样导致自己写的工程过几个月可能就无法编译了,从Github导入一个工程想直接运行基本不可能,报错也经常是莫名其妙!
- 无穷无尽的Gradle Wrapper:Gradle由于极差的兼容性而使用Wrapper方式运行,而这种方式会下载一个工程对应版本的Gradle,用不了多久你的
~/.gradle/wrapper
目录下就会存在N多个不同版本的Gradle程序! - 占用大量资源:Gradle的守护进程模式从架构上看固然是个好设计,然而实际用起来初次启动速度较慢,运行起来极耗内存!
- 怪异的缓存设计:同样都是缓存在本地的Jar包,Gradle支持引入Maven本地仓库,却又故意独树一帜的设计了一个不兼容Maven本地仓库格式的“缓存”路径,如果你开发中有时用Maven有时用Gradle,你就不得不维护两个内容相同但格式不同的庞大文件夹!
- 教科书式的极致过度设计:Gradle的口号居然是“Build Anything”,从第一步就在错误的方向上越走越远!
Gradle安装配置
我们在官方网站下载页面可以找到对应的安装包,我这里使用的是7.4.2
版本。
其中binary-only
代表只包含编译好的可执行程序,complete
则包含源码、文档等,因此体积较大,我们下载前者即可。
下载安装包后解压,新建环境变量GRADLE_HOME
指向其文件夹,此外还需要在PATH
中增加bin
目录路径。配置完成后,可以使用gradle -v
检查是否安装成功。
全局配置和缓存路径
Gradle相关的配置脚本、缓存数据等,默认会存储在~/.gradle
文件夹下。
|_caches 下载的Jar包等缓存目录
|_daemon GradleDaemon的日志等数据
|_init.d 全局的初始化脚本,我们可以在其中自定义脚本内容
|_wrapper Wrapper模式运行,下载的不同版本的Gradle程序
|_gradle.properties Gradle全局配置文件
Gradle有时会因为缓存莫名其妙报错,如果有必要我们可以将caches
、wrapper
路径删除。
GradleWrapper:Wrapper顾名思义是Gradle包装程序,它可以自动下载工程构建所需对应版本的Gradle程序并用于构建。相比直接使用本机安装的Gradle,一定程度上能够避免版本兼容问题。
Maven仓库配置
Gradle依赖会从Maven仓库下载,且支持Maven远程仓库和Maven本地仓库。如果已经使用过很长一段时间的Maven,指定Gradle从Maven本地仓库下载数据能够极大减少Gradle的下载时间;此外由于Maven的远程仓库默认为Maven Central,速度可能较慢,我们可以配置阿里云远程仓库。
在~/.gradle/init.d
下新建初始化脚本repository.gradle
(可以任意命名)并配置如下内容。
allprojects {
repositories {
mavenLocal()
maven { name "aliyun"; url "https://maven.aliyun.com/repository/public" }
mavenCentral()
}
}
这里我们指定了按照Maven本地仓库、阿里云远程仓库、MavenCentral仓库的顺序下载依赖。其中,mavenLocal()
默认会采用~/.m2/repository
路径。
Gradle工程结构
我们可以使用IDE来创建工程也可以直接新建目录并创建必要的文件,Gradle命令行工具也提供了一个创建工程的交互式工具,我们可以执行如下命令创建工程。
gradle init
生成的Java工程目录结构如下。
|_.gradle # 工程缓存数据
|_gradle
|_wrapper # 下载Wrapper程序的可执行Jar和配置文件等
|_app # Gradle模块(即使是单模块工程也会创建一个默认的app模块)
|_src
|_main
|_java
|_resources
|_test
|_build.gradle # 当前模块的Gradle构建脚本
|_gradlew # GradleWapper模式运行的脚本
|_gradlew.bat # GradleWapper模式运行的脚本(Windows)
|_settings.gradle # 工程配置
Gradle工程的目录结构和Maven比较类似,只是配置文件不同,这里要注意的是.gradle
文件夹是缓存信息,不要提交到版本控制系统;而gradle
文件夹因为包含Wrapper配置,需要提交到版本控制系统,否则其他人拿到工程无法得知该工程需要使用哪个版本的Gradle构建。