简介

gradle的最新版本是6.7,从2009年的第一个版本,到2020年的6.7,曾经倒退了11年了。gradle是作为android的官网构建工具引入的,除了java,它还可能反对多种语言的构建,所以用处十分宽泛。

gradle是开源的构建工具,你能够应用groovy或者kotlin来编写gradle的脚本,所以说gradle是一个十分弱小的,高度定制化的和十分疾速的构建工具。

依据我的理解,尽管gradle十分弱小,然而对于java程序员来说,个别还是都应用的maven,或者同时提供maven和gradle两种构建形式。

为什么会这样呢?集体感觉有两个起因:

第一个起因是gradle安装文件和依赖包的网络环境,如果单单依附国内的网络环境的话,十分难装置实现。

第二个起因就是gradle中须要本人编写构建脚本,绝对于纯配置的脚本来说,比较复杂。

装置gradle和解决gradle装置的问题

gradle须要java8的反对,所以,你首先须要装置好JDK8或者以上的版本。

❯ java -versionjava version "1.8.0_151"Java(TM) SE Runtime Environment (build 1.8.0_151-b12)Java HotSpot(TM) 64-Bit Server VM (build 25.151-b12, mixed mode)

装置gradle有两种形式,一种就是最简略的从官网下面下载安装包。而后解压在某个目录,最初将PATH指向该目录下的bin即可:

❯ mkdir /opt/gradle❯ unzip -d /opt/gradle gradle-6.7-bin.zip❯ ls /opt/gradle/gradle-6.7LICENSE  NOTICE  bin  README  init.d  lib  mediaexport PATH=$PATH:/opt/gradle/gradle-6.7/bin

如果你想应用包管理器,比方MAC下面的brew来进行治理的话,则能够这样装置:

brew install gradle

然而这样装置很有可能在下载gradle安装包的时候卡住。

==> Downloading https://services.gradle.org/distributions/gradle-6.4.1-bin.zip##O#- #

怎么办呢?

这时候咱们须要自行下载gradle-6.4.1-bin.zip安装包,而后将其放入http服务器中,让这个压缩包能够通过http协定来拜访。

简略点的做法就是将这个zip文件拷贝到IDEA中,利用IDEA本地服务器的预览性能,取得zip的http门路,比方:http://localhost:63345/gradle/gradle-6.7-all.zip.

接下来就是最精彩的局部了,咱们须要批改gradle.rb文件:

brew edit gradle

应用下面的命令能够批改gracle.rb文件,咱们替换掉上面的一段:

  homepage "https://www.gradle.org/"  url "https://services.gradle.org/distributions/gradle-6.7-all.zip"  sha256 "0080de8491f0918e4f529a6db6820fa0b9e818ee2386117f4394f95feb1d5583"

url替换成为http://localhost:63345/gradle/gradle-6.7-all.zip,而sha256能够应用 sha256sum gradle-6.7-all.zip这个命令来获取。

替换之后,从新执行brew install gradle即可装置实现。

装置结束之后,咱们应用gradle -v命令能够验证是否装置胜利:

gradle -vWelcome to Gradle 6.7!

Gradle个性

gradle作为一种新的构建工具,因为它是依赖于groovy和kotlin脚本的,基于脚本的灵活性,咱们通过自定义脚本基本上能够做任何想要的构建工作。

尽管说gradle能够做任何构建工作,然而gradle当初还是有肯定的限度,那就是我的项目的依赖我的项目前只反对于maven和Ivy兼容的存储库以及文件系统。

gradle通过各种预约义的插件,能够轻松的构建通用类型的我的项目,并且反对自定义的插件类型。

另外一个十分重要的个性是gradle是以工作为根底的,每一个build都蕴含了一系列的task,这些task又有各自的依赖关系,而后这些task一起形成了一个有向无环图Directed Acyclic Graphs (DAGs)。

有了这个DAG,gradle就能够决定各个task的程序,并执行他们。

咱们看两个task DAG的例子,一个是通用的task,一个是专门的编译java的例子:

task能够依赖task,咱们看个例子:

task hello {    doLast {        println 'Hello world!'    }}task intro {    dependsOn hello    doLast {        println "I'm Gradle"    }}

一个task能够蕴含Actions,inputs和Outputs。依据须要这些类型能够自由组合。

规范task

Gradle蕴含了上面7种规范的task:

  • clean :用来删除build目录和外面的所有。
  • check:这是一个生命周期工作,通常做一些验证工作,比方执行测试工作等。
  • assemble :这是一个生命周期工作,用来生成可散发的文件,比方jar包。
  • build: 也是一个生命周期工作,用来执行测试工作和生成最初的production文件。通常咱们不在build中间接做任何特定的工作操作,它个别是其余工作的组合。
  • buildConfiguration: 组装configuration中指定的archives。
  • uploadConfiguration: 除了执行buildConfiguration之外,还会执行上传工作。
  • cleanTask: 删除特定的某个task的执行后果。

Build phases

一个gradle的build蕴含了三个phases:

  • Initialization: 初始化阶段。gradle反对一个或者多个project的build。在初始化阶段,gradle将会判断到底有哪些project将会执行,并且为他们别离创立一个project实例。
  • Configuration: 配置阶段。gradle将会执行build脚本,而后剖析出要运行的tasks。
  • Execution: 执行阶段。gradle将会执行configuration阶段剖析进去的tasks。

Gradle Wrapper

下面讲的是gradle的手动装置,如果是在多人工作的环境中应用了gradle,有没有什么方法能够不必手动装置gradle就能够主动运行gradle程序呢?

办法当然有,那就是gradle wrapper:

gradle wrapper是一个工具,通过它咱们能够不便的对本地的gradle进行治理。

上图列出了gradle wrapper的工作流程,第一步是去下载gradle的安装文件,第二步是将这个安装文件解压到gradle的用户空间,第三步就是应用这个解压进去的gradle了。

咱们先看下怎么创立gradle wrapper:

尽管Gradle wrapper的作用是帮咱们下载和装置gradle,然而要生成gradle wrapper须要应用gradle命令才行。也就是说有了wrapper你能够依照胜利gradle,有了gradle你才能够生成gradle wrapper。

如果咱们曾经手动依照好了gradle,那么能够执行上面的命令来生成gradle wrapper:

$ gradle wrapper> Task :wrapperBUILD SUCCESSFUL in 0s1 actionable task: 1 executed

先看下生成进去的文件构造:

.├── gradle│   └── wrapper│       ├── gradle-wrapper.jar│       └── gradle-wrapper.properties├── gradlew└── gradlew.bat

gradle/wrapper/gradle-wrapper.properties 是 wrapper的配置文件,咱们看下外面的内容:

distributionBase=GRADLE_USER_HOMEdistributionPath=wrapper/distsdistributionUrl=https\://services.gradle.org/distributions/gradle-6.7-all.zipzipStoreBase=GRADLE_USER_HOMEzipStorePath=wrapper/dists

其中distributionUrl就是咱们要下载的gradle的门路,其余的配置是gradle的装置目录。

一般来说有两种安装文件类型:bin和all。bin和all的区别在于,bin只有安装文件,而all还蕴含了gradle的文档和样例代码。

咱们能够通过--distribution-type参数来批改安装文件的类型。此外还有 --gradle-version ,--gradle-distribution-url和--gradle-distribution-sha256-sum 这几个参数能够应用。

$ gradle wrapper --gradle-version 6.7 --distribution-type all> Task :wrapperBUILD SUCCESSFUL in 0s1 actionable task: 1 executed

除了配置文件之外,咱们还有3个文件:

  • gradle-wrapper.jar: wrapper业务逻辑的实现文件。
  • gradlew, gradlew.bat :应用wrapper执行build的执行文件。也就是说咱们能够应用wrapper来执行gradle的build工作。

wrapper的应用

咱们能够这样应用gradlew,来执行build:

gradlew.bat build
留神,如果你是第一次在我的项目中执行build命令的话,将会主动为你下载和装置gradle。

wrapper的降级

如果咱们想要降级gradle的版本,也很简略:

./gradlew wrapper --gradle-version 6.7

或者间接批改 gradle-wrapper.properties 也能够。

一个简略的build.gradle

咱们看一个非常简单的gradle的例子:

plugins {    id 'application' }repositories {    jcenter() }dependencies {    testImplementation 'junit:junit:4.13'     implementation 'com.google.guava:guava:29.0-jre' }application {    mainClass = 'demo.App' }

下面咱们须要装置一个application plugin,应用的是jcenter的依赖仓库,还指定了几个具体的依赖项。最初,指明了咱们应用程序的mainClass。

gradle应用maven仓库

build.gradle中的repositories指明的是应用的仓库选项。

默认状况下gradle有本人的本地仓库,个别在~/.gradle目录上面,如果咱们之前用的是maven仓库,那么在本地的maven仓库中曾经存在了很多依赖包了,如何重用呢?

咱们能够这样批改repositories:

    mavenLocal()    mavenCentral()

这样的话, 就会优先从maven的仓库中查找所需的jar包。

总结

本文只是一个很简略的gradle介绍,让大家对gradle有一个根本的理解,前面咱们会具体的介绍gradle的各种用法,敬请期待。

本文已收录于 http://www.flydean.com/gradle-kick-off/

最艰深的解读,最粗浅的干货,最简洁的教程,泛滥你不晓得的小技巧等你来发现!

欢送关注我的公众号:「程序那些事」,懂技术,更懂你!