文章目录
新一代构建工具Gradle入门知识简介
笔者能力有限,如有错误,欢迎指正。
构建工具进化史
-
第一代 Ant 2000
-
第二代 Maven 2004
-
第三代 Gradle 2012
ANT
-
ant是出现最早的工具, 它在一些方面跟Make工具很相像。它在2000年发布,并在短时间内成为了最流行的Java项目构建工具。 它非常简单易学, 人们不需要专门去学习他, 就可以拿来使用。它基于编程的思想设计。
-
后来发布的版本, 开始支持插件。
-
它的主要缺点是配置文件使用XML, 从而导致了分级的架构, 从而不适于用编程的思想去使用它;另一个问题是在管理小项目的时候配置文件过于庞大臃肿。
MAVEN
-
maven于2004年发布, 它起初的目的是解决程序员在使用ant时碰到的一些问题。
-
maven仍然使用xml作为配置文件规范, 但是架构不同了。ant要求开发者把构建过程中使用的所有命令都要在xml里描述,而maven主要依赖于一些默认设置和惯例, 大大减少了配置文件的体积。
-
maven最重要的一个特性是可以通过网络下载配置文件中描述的依赖, 这改变了源代码管理的方式。 不过ant通过ivy(依赖管理工具)也可以实现这个特性了。
GRADLE
-
gradle结合了上边两个的优点, 同时基于DSL描述配置,以及其他的一些改进。 它拥有ant的灵活性和强大功能, 也有maven的生命周期管理和易用性。
-
它在2012年一发布, 就在短期内获得了大量关注, 比如谷歌的android, 已经把gradle做为了android studio的官方构建工具。
-
gradle不使用xml作为配置文件,它使用基于Groovy开发的DSL, 所以gradle的配置文件比ant和maven的更加高效和简洁。 由于该DSL是专门为它开发的, 所以它的配置文件要比ant和maven少得多,在整个开发、测试、打包、部署的整个生命周期都是如此。
-
它跟ant一样,使用了ivy作为jar包的依赖管理工具。
为何选择Gradle
- Gradle产生较晚,充分吸取了ant和maven的优点
- Gradle语法简洁,可读性更大
- Gradle拥有更大的自定义能力,新增功能比较方便
- Gradle充分吸收了约定大于配置的思想,而配置即代码又提供了更多的灵活性
- 对比报告:https://gradle.org/maven-vs-gradle/
- 性能比较:https://gradle.org/gradle-vs-maven-performance/
- 总而言之一句话,Gradle不仅配置精炼简洁,还具有更好的灵活性与可扩展性,结合了ant和maven的优点,加快项目的自动化构建。
- 从Maven迁移到Gradle:https://guides.gradle.org/migrating-from-maven/
Gradle
-
Gradle是一个构建工具,专注于自动化构建,支持多语言开发。
-
Gradle提供了一个灵活的模型支持在任何平台上构建,测试,发布和部署软件,支持从编译到打包到发布网站的整个开发生命周期。
-
Gradle旨在支持跨多种语言和平台(包括Java,Scala,Android,C / C ++和Groovy)的构建自动化,并与开发工具和持续集成服务器(包括Eclipse,IntelliJ和Jenkins)紧密集成。
-
Gradle 是一个编译打包工具,但实际上它也是一个编程框架。Gradle 有自己的 API 文档:https://docs.gradle.org/current/dsl/
-
官网地址:https://gradle.org/
-
用户手册:https://docs.gradle.org/current/userguide/userguide.html
特征
- 按约定声明构建和建设;
- 强大的支持多工程的构建;
- 强大的依赖管理(基于Apache Ivy),提供最大的便利去构建工程;
- 全力支持已有的 Maven 或者Ivy仓库基础建设;
- 支持传递性依赖管理,在不需要远程仓库和pom.xml和ivy配置文件的前提下;
- 基于groovy脚本构建,其build脚本使用groovy语言编写;
- 具有广泛的领域模型支持构建;
- 深度 API;
- 易迁移;
- 自由和开放源码,Gradle是一个开源项目,基于 ASL 许可
- 更多详情请访问:https://gradle.org/features/
安装
- 请确保已安装配置好jdk1.7+
命令行工具安装
- 官方安装说明:https://gradle.org/install/
下载文件安装
- gradle下载地址:http://services.gradle.org/distributions/
- 安装步骤:1-下载 ,2-解压,3-配置 ,4-测试
- 以下以windows为例作下环境搭建说明:
- 下载Gradle版本文件
- 解压文件
- 新增环境变量GRADLE_HOME,存放gradle的解压路径
- 将GRADLE_HOME\bin加入到环境变量Path中
- CMD中输入“gradle -v”,如果出现版本号则表示已经搭建完毕
新建工程
- 官方文档:https://guides.gradle.org/creating-new-gradle-builds/
默认任务
gradle的任务支持简写,如gradle assemble与gradle ass是一致的,gradle assembleDebug与gradle aD是一致的
-
gradle tasks //Displays the tasks runnable from root project
-
gradle projects //Displays the sub-projects of root project
-
gradle init //Intializes a new Gradle build
-
gradle wrapper //Generate Gradle wrapper files
-
gradle properties //Displays the properties of root project
-
gradle help // declared in root project
-
gradle model //Displays the configuration model of root project
-
gradle dependentComponents//Displays the dependent components of components in root project
-
gradle dependencyInsight//Displays the insight into a specific dependency in root project
-
gradle dependencies //Displays all dependencies in root project
-
gradle components // Displays the components produced by root project
-
gradle buildEnvironment // Displays all buildscript dependencies declared in root project
-
以上是gradle的默认任务,其他定制任务都需要自己实现,如清空构建时生成的目录可定义如下任务:
//clean任务示例 task clean(type: Delete) { delete rootProject.buildDir }
-
多模块工程可以通过如下方式执行任务
gradle :mySubproject:taskName
配置gradle.properties
Gradle Wrapper
- Gradle Wrapper顾名思义是gradle的包装,是为了解决兼容性问题,可以让用户在机子没有Gradle配置环境的情况下使用gradle工程
- wrapper会以/gradle/wrapper/gradle-wrapper.properties中声明的gradle路径(distributionUrl)下载指定gradle版本
distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists distributionUrl=https\://services.gradle.org/distributions/gradle-4.8.1-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists
-
如果用户工程目录下没有gradlew和gradlew.bat文件,则用户可以通过执行 gradle wrapper生成这两个文件,其中gradlew是一个shell脚本,可以在unix和linux中使用,gradlew.bat则是在windows中使用
-
通过gradlew可以替代gradle(用法与gradle完全一致,只是把gradle改为gradlew即可,有些系统需要为./gardlew),以解决本机没有安装gradle的问题
构建周期
-
Gradle的构建清晰的分为三个阶段:
- 初始化阶段
Gradle提供了单项目和多项目的构建,在初始化阶段,他要决定哪些项目要参与到构建中来,并创建这些项目的实例 - 配置阶段
在这个阶段需要参与到本次构建的项目的构建脚本将会被执行,这些项目的对象将被配置,这个特性叫做configuration on demand - 执行阶段
Gradle为在配置阶段创建和配置的任务再次筛选需要执行的任务的子集,这个子集的筛选是由在命令行下传递给Gradle的任务名和目录决定的,子集中的每个任务都会被执行
- 初始化阶段
-
不同任务之间可能相互依赖,因此在配置阶段Gradle会产生依赖关系图,没有依赖的任务通常会被优先执行,被依赖的任务优先依赖任务执行,一旦一个任务被执行过就不会再次执行
-
https://docs.gradle.org/current/userguide/build_lifecycle.html
Gradle build scan
- gradle build scan是一个在线查看构建过程中详细信息的工具,包括当前构建的环境,使用的版本,错误日志,task执行情况以及优化建议等。
- 官方文档:https://guides.gradle.org/creating-build-scans/
- 使用步骤
-
添加插件
//build.gradle文件 plugins { id 'com.gradle.build-scan' version '1.16' } buildScan { termsOfServiceUrl = 'https://gradle.com/terms-of-service' termsOfServiceAgree = 'yes' }
-
执行命令
gradle build --scan
-
成功后在窗体上会显示在线访问路径
-
插件
- 我们经常会看到诸如apply plugin: 'java’的插件声明,通过以上脚本应用之后,java插件会为你的工程添加很多有用的默认配置和约定,比如源代码的位置,单元测试代码的位置,资源文件的位置等
- java插件约定的项目结构:
example - build.gradle - src - main - java - resources - test - java - resources
- 其中main和test是java插件为我们内置的两个源代码集合,如果你想自定义一个(比如aaa),则可以通过如下脚本后,就可以仿照main和test,只是一般不建议这么做。
apply plugin:'java' sourceSets{ aaa{ } }
Gradle依赖模式
-
可以为不同源集指定不同的依赖,比如mainCompile即为main源集(sourceSet)指定特定的依赖
-
依赖方式
- 远程依赖
compile (‘org.springframework.boot:spring-boot-autoconfigure’) - 工程依赖
compile project(‘:example’) - 本地依赖
compile files(‘libs/exa-1.0.jar’,‘libs/exa-2.0.jar’)
compile fileTree(dir:‘libs’,include:‘*.jar’)
- 远程依赖
多项目构建
-
如果我们有一个包含多模块的工程,比如a,b,c三个模块工程,每个模块工程都有自己的build.gradle文件,每个build.gradle之中都有一些通用的配置是一模一样的,此时需要有一个公共的build.gradle用来管理这三个模块
-
假设有一个工程master,有两个子模块module1,module2,那么一般的目录结构如下
master - build.gradle //所有子模块通用的 - settings.gradle //声明所有子模块 - module1 - build.gradle //子模块自己独立的 - module2 - build.gradle //子模块自己独立的
-
其中settings.gradle内容如下:
include ':module1', ':module2'
缓存
- gradle可以使用缓存极大地提高构建速度,但用户有时如果不想启用缓存可以通过如下方式关闭:
在gradle.properties中添加org.gradle.caching=false即可 - 详情访问:https://docs.gradle.org/current/userguide/build_cache.html
插件
- 插件搜索(速度奇慢):https://plugins.gradle.org/
- 官方插件:https://docs.gradle.org/current/userguide/plugin_reference.html
小技巧
- 查询依赖库最新版本:maven仓库:https://mvnrepository.com/
- 自定义maven库路径
maven{ url "..." }
DSL
-
DSL的全称是domain-specific language,它在wiki上的定义如下:
A domain-specific language (DSL) is a computer language specialized to a particular application domain.
与之相对的是GPL(general-purpose language)。
DSL指的是针对特定应用领域而设计使用的计算机语言,而GPL指的是针对跨应用领域而设计使用的计算机语言。
常见的DSL有:HTML,Shell,make语言,ant语言,maven语言,rpm语言,dpkg语言,awk语言,正则表达式,dc计算机语言等,有些DSL语言又被称为微型语言
常见的GPL有:Java,C等 -
https://docs.gradle.org/current/dsl/
-
https://docs.gradle.org/current/userguide/groovy_build_script_primer.html
-
gradle是使用一种基于Groovy的特定领域语言(DSL)来声明项目设置,抛弃了基于XML的各种繁琐配置
-
除了Groovy,gradle后面还支持了kotlin的DSL(gradle5.0后开始支持)
-
当在build.gradle中声明如下时
aaa 'bbb' ccc 'ddd' eee 'fff'
-
实际上就是aaa(‘bbb’).ccc(‘ddd’).eee(‘fff’)
groovy
- 试用groovy语法的话可以在idea的tools中找到groovy console
- groovy不需要分号,括号是可选的
- groovy默认以最后一个值作为返回值
- groovy是弱类型的,用def表示
- 使用“==”判断相等时不会引起空指针异常
- 可以使用assert
- 单引号表示纯粹的字符串,双引号可以在里面使用变量,三引号支持换行
问答
问:如何查看任务之间的依赖?
- 答:命令行输入“gradle(w) taskname -m”,如gradlew build -m即可查看到任务build之前需要执行的任务列表。
问:很多人都会奇怪,到底build.gradle里使用的插件究竟放置在哪里?
- 答: Mac系统默认下载到:/Users/(用户名)/.gradle/caches/modules-2/files-2.1
Windows系统默认下载到:C:\Users(用户名).gradle\caches\modules-2\files-2.1
问:你会不会好奇在build.gradle里完全看不出springboot依赖的版本信息,那么版本管理具体是在哪里指定的呢?
- 答:windows用户在C:\Users(用户名).gradle\caches\modules-2\files-2.1\org.springframework.boot\spring-boot-dependencies目录下可以找到答案,当我们打开spring-boot-dependencies-x.x.x.RELEASE.pom文件,版本信息一目了然
参考
十分钟理解Gradle - Bonker - 博客园
https://www.cnblogs.com/Bonker/p/5619458.html
Gradle教程™
https://www.yiibai.com/gradle/
Gradle - DSL - Jeanboy - CSDN博客
https://blog.csdn.net/freekiteyu/article/details/81066845
写出gradle风格的groovy代码 - 番茄沙司 - 博客园
https://www.cnblogs.com/zqlxtt/p/5741306.html
[Gradle中文教程系列]-跟我学Gradle-5.3:依赖-管理依赖的版本(传递(transitive)\排除(exclude)\强制(force)\动态版本(+)) - 如是我闻 - CSDN博客
https://blog.csdn.net/pkaq_/article/details/53906668
Android Gradle 下载的依赖包位置 - 简书
https://www.jianshu.com/p/e8db626d768f