Gradle 简易入门教程

article/2025/10/6 4:55:38

作者: Yann  

来源:原力注入


Gradle 是一种构建工具,它抛弃了基于XML的构建脚本,取而代之的是采用一种基于 Groovy(现在也支持 Kotlin)的内部领域特定语言。


Gradle特点


  1. Gradle是很成熟的技术,可以处理大规模构建

  2. Gradle对多语言、多平台支持性更好

  3. Gradle关注在构建效率上

  4. Gradle发布很频繁,重要feature开发计划透明化

  5. Gradle社区很活跃,并且增加迅速


安装Gradle


  • 从 官网 (https://gradle.org/install/)下载二进制文件。

  • 解压Zip文件,加入环境变量(在PATH中加入GRADLE_HOME/bin目录)


如果在安装过程中遇到问题,可以进一步查看官方的安装指南(https://gradle.org/install/)。最后验证一下 Gradle 是否工作正常


 
  1. gradle -v

  2. ------------------------------------------------------------

  3. Gradle 4.2.1

  4. ------------------------------------------------------------

  5. Build time:   2017-10-02 15:36:21 UTC

  6. Revision:     a88ebd6be7840c2e59ae4782eb0f27fbe3405ddf

  7. Groovy:       2.4.12

  8. Ant:          Apache Ant(TM) version 1.9.6 compiled on June 29 2015

  9. JVM:          1.8.0_162-ea (Oracle Corporation 25.162-b01)

  10. OS:           Mac OS X 10.13.5 x86_64


Gradle快速体验


初始化一个项目


  • 创建一个 demo 目录

 
  1. ❯ mkdir gradle-demo


  • 初始化 Gradle 项目

 
  1. ❯ gradle init

  2. Starting a Gradle Daemon (subsequent builds will be faster)

  3. BUILD SUCCESSFUL in 3s

  4. 2 actionable tasks: 2 executed



Gradle目录结构


我们看看上一步我们生成了什么文件


├── build.gradle  ❶
├── gradle
│   └── wrapper
│       ├── gradle-wrapper.jar    ➋
│       └── gradle-wrapper.properties  ➌
├── gradlew    ➍
├── gradlew.bat  ➎
└── settings.gradle  ➏


❶ 当前项目的配置脚本

➋ Gradle Wrapper 的执行jar包(后续介绍)

➌ Gradle Wrapper 的配置文件

➍ Gradle Wrapper Unix 系执行脚本

➎ Gradle Wrapper Windows 系执行脚本

➏ 项目脚本设置


创建一个Task


Gradle提供了用于通过基于Groovy或Kotlin的DSL创建和配置。项目包括一组Task,每个Task执行一些基本操作。


  • 创建一个目录叫 src

  • 在src目录创建一个 myfile.txt

  • 在构建文件中定义一个名为Copy的类型 Task ,该任务将src目录复制到名为dest的新目录


groovy代码:

 
  1. task copy(type: Copy, group: "Custom", description: "Copies sources to the dest directory") {

  2.    from "src"

  3.    into "dest"

  4. }



kotlin代码:

 
  1. tasks.create<Copy>("copy") {

  2.    description = "Copies sources to the dest directory"

  3.    group = "Custom"

  4.    from("src")

  5.    into("dest")

  6. }


group 和 description 是自定义的任意值。现在让我们执行这个 task

 
  1. ❯ ./gradlew copy

  2. > Task :copy

  3. BUILD SUCCESSFUL in 0s

  4. 1 actionable task: 1 executed



再一次 ls 我们就可以看见 gradle 为我们创建了一个新的 dest 目录并且将 文件复制进去。


Gradle Task


在Gradle中,有两个基本概念:项目和任务。

  • 项目是指我们的构建产物(比如Jar包)或实施产物(将应用程序部署到生产环境)一个项目包含一个或多个任务。

  • 任务是指不可分的最小工作单元,执行构建工作(比如编译项目或执行测试)。

640?wx_fmt=png

在项目目录中的 build.gradle 指定了一个项目和它的任务。


Task执行顺序


任务可能依赖于其他任务,或者可能被安排为始终在另一个任务之后运行。

 
  1. project('projectA') {

  2.    task taskX(dependsOn: ':projectB:taskY') {

  3.        doLast {

  4.            println 'taskX'

  5.        }

  6.    }

  7. }

  8. project('projectB') {

  9.    task taskY {

  10.        doLast {

  11.            println 'taskY'

  12.        }

  13.    }

  14. }



 
  1. > gradle -q taskX

  2. taskY

  3. taskX  // taskx 在 y 之后



我们可以用 dependsOn 让我们的 Task 有顺序的运行起来。


Gradle插件


看到这里,如果每一件事情我们都需要写 Task 岂不是会累死,而且很多功能是可以被复用的,所以Gradle 提供一个 插件 功能,Gradle 默认就内置了大量的插件,比如在 base 中有一系列的功能。


groovy代码

 
  1. plugins {

  2.    id "base"

  3. }



kotlin代码:

 
  1. plugins {

  2.    id("base")

  3. }



这个时候我们就可以利用一些额外的 Task,举个例子,我们要把一个目录中的东西都打成一个 ZIP 压缩包。


groovy代码:

 
  1. task zip(type: Zip, group: "Archive", description: "Archives sources in a zip file") {

  2.    from "src"

  3.    setArchiveName "basic-demo-1.0.zip"

  4. }



kotlin代码:

 
  1. tasks.create<Zip>("zip") {

  2.    description = "Archives sources in a zip file"

  3.    group = "Archive"

  4.    from("src")

  5.    setArchiveName("basic-demo-1.0.zip")

  6. }


Gradle 的设计理念是

  • 在项目中添加新任务

  • 为新加入的任务提供默认配置,这个默认配置会在项目中注入新的约定(如源文件位置)。

  • 加入新的属性,可以覆盖插件的默认配置属性。

  • 为项目加入新的依赖。


Gradle Java


Gradle 内置了 Java 插件,Java插件将Java编译以及测试和捆绑功能添加到项目中。它是许多其他Gradle插件的基础。如果我们需要使用 Java 插件 修改 build.gradle


 
  1. plugins {

  2.    id 'java'

  3. }



一旦导入了 Java 插件,就会有一系列的默认的配置值,并且会导入大量的 Task。

Task含义
compileJava(type: JavaCompile)Java 编译
processResources(type: Copy)拷贝 Resources 资源
classes(type: Task)组装 Java 类
compileTestJava(type: JavaCompile)Java Test 编译
processTestResources(type: Copy)拷贝 Test Resources 资源
testClasses(type: Task)组装 Test 类
jar(type: Jar)合成Jar包
javadoc(type: Javadoc)生成 doc 文档
test(type: Test)运行测试
uploadArchives(type: Upload)上传 jar 到仓库
clean(type: Delete)clean

我们从这些 Task 名字就可以看出来他们分别作作了, 和其他的设计理念类型,在 Task 也会嵌入一些生命周期,其实原理也就是我们之前看的执行顺序。

640?wx_fmt=png

资源:Gradle插件仓库


Gradle依赖管理


先盗取一张官方的图。

640?wx_fmt=png


和 Maven 类似,Gradle 也会将依赖缓冲在本地中,方便在无网的环境使用,和依赖管理相关的有两个参数,举个例子。


 
  1. repositories {

  2.    mavenCentral() // 定义仓库

  3. }

  4. dependencies {

  5.    compile 'org.springframework:spring-web:5.0.2.RELEASE' // 定义依赖

  6. }


Gradle支持以下仓库格式:

  • Ivy仓库

  • Maven仓库

  • Flat directory仓库


lvy仓库


我们可以通过URL地址或本地文件系统地址,将Ivy仓库加入到我们的构建中。

 
  1. repositories {

  2.    ivy {

  3.        url "http://ivy.petrikainulainen.net/repo"

  4.    }

  5. }

  6. //或者是本地

  7. repositories {

  8.    ivy {      

  9.        url "../ivy-repo"

  10.    }

  11. }



Maven仓库


 
  1. repositories {

  2.    maven {

  3.        url "http://maven.petrikainulainen.net/repo"

  4.    }

  5. }



在加入Maven仓库时,Gradle提供了三种“别名”供我们使用,它们分别是

  • mavenCentral()别名,表示依赖是从Central Maven 2 仓库中获取的。

  • jcenter()别名,表示依赖是从Bintary’s JCenter Maven 仓库中获取的。

  • mavenLocal()别名,表示依赖是从本地的Maven仓库中获取的。


Flat Directory仓库


 
  1. repositories {

  2.    flatDir {

  3.        dirs 'lib'

  4.    }

  5. }

  6. //多个仓库

  7. repositories {

  8.    flatDir {

  9.        dirs 'libA', 'libB'

  10.    }

  11. }



依赖管理



在配置完项目仓库后,我们可以声明其中的依赖,首先 Java 插件指定了若干依赖配置项

  • compile 配置项中的依赖是依赖必须的。

  • runtime 配置项中包含的依赖在运行时是必须的。

  • testCompile 配置项中包含的依赖在编译项目的测试代码时是必须的。

  • testRuntime 配置项中包含的依赖在运行测试代码时是必须的。


在 Gradle 最新版本中更是增加

  • implementation 配置项中的实现类

  • api 配置项中的暴露API


 
  1. dependencies {

  2.    api 'commons-httpclient:commons-httpclient:3.1'

  3.    implementation 'org.apache.commons:commons-lang3:3.5'

  4. }



声明项目依赖


最普遍的依赖称为外部依赖,这些依赖存放在外部仓库中。一个外部依赖可以由以下属性指定:

  • group属性指定依赖的分组(在Maven中,就是groupId)

  • name属性指定依赖的名称(在Maven中,就是artifactId)

  • version属性指定外部依赖的版本(在Maven中,就是version)


 
  1. dependencies {

  2.    compile group: 'foo', name: 'foo', version: '0.1'

  3. }

  4. // 我们也可以合并到一起去

  5. dependencies {

  6.    compile 'foo:foo:0.1'

  7. }



声明项目文件依赖


我们如何依赖本地的一些 jar 呢,正确的操作是如下

 
  1. dependencies {

  2.    compile files('libs/commons-lang.jar', 'libs/log4j.jar')

  3. }



声明依赖排除项目


我们都知道在 Maven中我们有

 
  1.    <dependency>

  2.        <groupId>sample.ProjectB</groupId>

  3.        <artifactId>Project-B</artifactId>

  4.        <version>1.0-SNAPSHOT</version>

  5.        <exclusions>

  6.            <exclusion>

  7.                <groupId>log4j</groupId>

  8.                <artifactId>log4j</artifactId>

  9.            </exclusion>

  10.        </exclusions>

  11.    </dependency>


而在 Gradle 中,我们可以这么做。

 
  1. compile('com.example.m:m:1.0') {

  2.    exclude group: 'org.unwanted', module: 'x

  3. }



Gradle与Kotlin


我们想要在 gradle 中增加 kotlin 非常的简单,仅仅需要在 build.gradle 增加

 
  1. plugins {

  2.     id "org.jetbrains.kotlin.jvm" version "x.x.xx" // 增加插件

  3. }

  4. dependencies {

  5.  compile "org.jetbrains.kotlin:kotlin-stdlib:x.xx.xx" // 增加依赖

  6. }



大功告成,对了,默认的 Kotlin 的源码路径是 src/main/kotlin, 测试源码是 src/text/kotlin 如果需要修改可以使用

 
  1. sourceSets {

  2.    main.kotlin.srcDirs += 'src/main/myKotlin'

  3.    main.java.srcDirs += 'src/main/myJava'

  4. }




其他


Gradle Wrapper



Gradle Wrapper 做了三件事情

  • 解析参数传入 gradlew

  • 安装正确的 Gradle 版本

  • 调用 Gradle 执行命令


Ops,Gradle Wrapper 为什么还需要安装 Gradle,我们在用 Maven 都知道,我们需要自己先安装好一个 Maven版本,因为 Maven 发展多年,现在已经稳定,已经不存在很多个版本并存的现状了,但是我们依然需要去在每个机器上去安装,那我什么我们不能在自己的 构建脚本 中就指定我们的构建工具呢?所以我们在 wrapper/gradle-wrapper.properties 中就可以发现 distributionUrl=https\://services.gradle.org/distributions/gradle-4.2.1-bin.zip 这里也就是定义了我们的gradle所使用的版本。


640?wx_fmt=png

Gradle In Real World

 
  1. // 定义一堆基础插件

  2. apply plugin: 'java'

  3. apply plugin: 'maven'

  4. apply plugin: "jacoco"

  5. apply plugin: 'checkstyle'

  6. apply plugin: 'pmd'

  7. apply plugin: 'findbugs'

  8. apply plugin: 'eclipse'

  9. apply plugin: 'idea'

  10. // 定义项目属性

  11. group = 'Common'

  12. version = '1.0.0'

  13. description = """Giant common library"""

  14. // 定义依赖仓库

  15. repositories {

  16.    mavenCentral()

  17. }

  18. // 额外增加source path

  19. sourceSets {

  20.    main {

  21.        resources {

  22.            srcDir "src/main/profiles/${profile}"

  23.        }

  24.    }

  25. }

  26. // project依赖

  27. dependencies {

  28.    compile 'ch.qos.logback:logback-core:1.0.13'

  29.    compile 'ch.qos.logback:logback-classic:1.0.13'

  30.    compile 'ch.qos.logback:logback-access:1.0.13'

  31.    compile 'commons-io:commons-io:2.0.1'

  32.    compile 'commons-lang:commons-lang:2.6'

  33.    compile 'joda-time:joda-time:1.6.2'

  34.    compile 'org.testng:testng:6.8.7'

  35.    compile 'com.googlecode.jmockit:jmockit:1.5'

  36.    ...

  37. }

  38. // task配置

  39. checkstyle {

  40.    ignoreFailures = true

  41.    sourceSets = [sourceSets.main]

  42. }

  43. findbugs {

  44.    ignoreFailures = true

  45.    sourceSets = [sourceSets.main]

  46. }

  47. pmd {

  48.    ruleSets = ["basic", "braces", "design"]

  49.    ignoreFailures = true

  50.    sourceSets = [sourceSets.main]

  51. }

  52. jacocoTestReport {

  53.    reports {

  54.        xml.enabled true

  55.        html.enabled true

  56.        csv.enabled false

  57.    }

  58.    sourceSets sourceSets.main

  59. }

  60. tasks.withType(Compile) {

  61.    options.encoding = "UTF-8"

  62. }

  63. test {

  64.    useTestNG()

  65.    jacoco {

  66.        excludes = ["org.*"]

  67.    }

  68. }



Gradle常用指令


枚列所有可用任务


 
  1. ❯ gradle tasks

  2. ------------------------------------------------------------

  3. All tasks runnable from root project

  4. ------------------------------------------------------------

  5. Archive tasks

  6. -------------

  7. zip - Archives sources in a zip file

  8. Build tasks

  9. -----------

  10. assemble - Assembles the outputs of this project.

  11. build - Assembles and tests this project.

  12. clean - Deletes the build directory.



构建配置属性

 
  1. ❯ gradle properties



显示构建详情


在 build.gradle 设置

 
  1. logging.level = LogLevel.DEBUG


或者在运行的

 
  1. ❯ gradle build --stacktrace


参考资料&推荐文档


  • Gradle入门教程(http://blog.jobbole.com/71999/)

  • Gradle介绍(https://www.jianshu.com/p/00d5469e25e7)

  • 官方教材(https://guides.gradle.org/creating-new-gradle-builds/)

-END-


 近期热文:

关注我

640?wx_fmt=jpeg

点击“阅读原文”,看本号其他精彩内容


http://chatgpt.dhexx.cn/article/9j7wc7yq.shtml

相关文章

Gradle的详细安装配置及使用教程

Gradle的详细安装配置及使用教程 Gradle的安装 到Gradle官网&#xff0c;官网地址&#xff1a;https://gradle.org/releases/。下载对应的版本&#xff0c;本文安装的是 4.3.1 版本。 下载完成后解压 环境配置 配置环境变量&#xff0c;新建名为 GRADLE_HOME 值为你的 Gr…

Gradle的使用教程

一、相关介绍 Gradle是一个好用的构建工具 &#xff0c;使用它的原因是&#xff1a; 配置相关依赖代码量少&#xff0c;不会像maven一样xml过多 打包编译测试发布都有&#xff0c;而且使用起来方便 利用自定义的任务可以完成自己想要的功能 二、安装 下载地址http://services…

Gradle最详细教程,关于Gradle,学习这些就够了.......

目录 Gradle的简介 Groovy语言的学习 Groovy环境变量的配置 第一个Groovy项目 变量的定义 字符串的定义 字符串的常用方法 流程控制 switch for 闭包 基本技能 闭包的使用场景 闭包中的变量 列表 定义方式 添加和删除 排序和查找 映射map map的操作 查找 …

Gradle简要教程

1 什么是Gradle 最初Android的开发是用Eclipse进行&#xff0c;Eclipse之所以能够用来开发Android项目&#xff0c;是因为一个叫做ADT&#xff08;Android Developer Tools&#xff09;的东西&#xff0c;使用ADT&#xff0c;我们只需要写好代码&#xff0c;然后直接在Eclip…

一、Gradle入门

文章目录 一、Gradle入门1.1 Gradle 简介1.2 常见的项目构建工具1.3 Gradle 安装1.3.1 Gradle 安装说明1.3.2 安装 JDK1.3.3 下载并解压到指定目录1.3.4 配置环境变量1.3.5 检测是否安装成功 1.4 Gradle 项目目录结构1.5 Gradle 创建第一个项目1.5.1 Gradle 中的常用命令1.5.2 …

gradle入门教程

一、gradle安装及配置 1、下载及安装 去gradle官网下载对应gradle安装包。首页点击“Install Gradle”&#xff0c;对应页面的“Installing manually”下点击download&#xff0c;选择对应版本下载即可。有Binary-only和Complete两种。Complete是带了文档的。然后解压到任意目…

Gradle 学习 ----Gradle 入门

1 、Gradle入门 Gradle入门 1 、Gradle入门1. 1 、Gradle简介1. 2 、常见的项目构建工具1. 3 、Gradle安装1. 3. 1 、Gradle安装说明1. 3. 2 、安装JDK1. 3. 4 、配置环境变量1. 3. 5 、检测是否安装成功1. 4 、Gradle项目目录结构1. 5 、Gradle创建第一个项目扩展:命令创建项目…

找不到适合自己的工作很迷茫怎么办?

有些人在求职的过程中&#xff0c;可能会遇到这样的情况&#xff1a;发offer的公司自己不想去&#xff0c;想去的公司又不愿意给自己一个机会&#xff0c;努力了很久但一直找不到合适的工作。这个时候&#xff0c;如果继续每天在家无所事事的话&#xff0c;很可能会越想越多&am…

找不到合适的工作怎么办

这是我在分答上收到的几个问题&#xff1a; 我刚刚为了一份喜欢的工作放弃了别人介绍的工作&#xff0c;是不是很冲动&#xff1f;职业上经常讲匹配度&#xff0c;但是在现实中为什么匹配度很难落地呢&#xff1f;你越不想要的&#xff0c;他越出现&#xff0c;你想要的&#x…

时局不利,如何化解职场焦虑?

部分数据来源&#xff1a;ChatGPT 在不景气的经济环境下&#xff0c;大多数求职者都面临极大的压力&#xff0c;而技术人员又是其中之一。他们不仅需要不断学习新技能&#xff0c;还需要面对工作市场的竞争&#xff0c;并努力将自己的技能提升到所需的水平。一旦被拒绝或无法找…

工作琐事太多怎么办_待办的事情太多,如何有条不紊的进行工作呢?

【子亦观点】:事情太多难以理清是很多人都遇到的问题,协调不好就会出现混乱的状态和低效的结果,更甚者会因此产生焦虑情绪。所以必须掌握科学合理的管理方法,并有效运用到工作和生活中,减轻压力和负担。 什么原因导致处理事务容易混乱? 1.总是被突发事件打断 当你坐到电脑…

找不着工作怎么办?以下六条一定要听我说。

找不着工作怎么办&#xff1f; 如果今年找不到工作&#xff0c;以下六条一定要听我说。 第一条呢&#xff0c;今年找不着工作可能跟你的能力没有太大的关系。所以不要沮丧&#xff0c;为什么&#xff1f;因为今年大环境非常糟糕&#xff0c;大厂动不动裁员。1/3还在继续裁。你…

如果一份工作让你时常感到焦虑,你会不会立马辞职?

点击上面↑「爱开发」关注我们 每晚10点&#xff0c;捕获技术思考和创业资源洞察 优越感可以让我们变得更自信&#xff0c;能适当有效缓解职场焦虑症&#xff0c;因为一个有成就感的人的内心通常会充满力量&#xff0c;正能量满满。 如果一份工作让你时常感到焦虑&#xff0c;你…

找不到工作怎么办,多半是“废了”,按这3步你也能找到工作

第一步&#xff0c;掂量自己 我们先算一下自己有几斤几两&#xff0c;看看自己的适合什么位置&#xff0c;避免做到自大或者是贬低自己&#xff0c;那么我们的工作中就能做的比较顺利。 掂量自己也是对自己的总结&#xff0c;在总结中我们就可以知道自己的红点和黑点&#xf…

常年不卷,按时下班,工作能力强,同事求助知无不言,不扯皮,不拉帮结派,这样的职场清流竟然被裁掉了!...

在职场上&#xff0c;你永远想不到什么样的员工会被优化&#xff0c;比如下面这位&#xff1a; 常年不卷&#xff0c;按时下班&#xff0c;工作很专业&#xff0c;同事问什么都回答&#xff0c;不扯皮&#xff0c;不拉帮结派&#xff0c;简直是职场清流。在上个月竟然被优化了&…

职场中,如何让“讨厌的人”配合自己工作?

在职场上&#xff0c;我们总会遇到那么几个不愿意配合你工作的人&#xff0c;不仅不配合&#xff0c;甚至还喜欢扯皮&#xff0c;推卸责任&#xff0c;甩锅给自己的队友。然而&#xff0c;我们也不可能因为工作中出现了这样一个或几个人&#xff0c;就离职不干&#xff0c;或者…

如何在工作中保持稳定的情绪? – 个人看法和建议

文章目录 每日一句正能量前言情绪波动的原因建议情绪调节技巧和策略身处逆境&#xff0c;如何治愈自己 后记 每日一句正能量 所谓的快乐&#xff0c;是指身体的无痛苦和灵魂的无纷扰。——伊壁鸠鲁 前言 在工作中保持稳定的情绪对于每一个职场人来说都是非常重要的。随着工作压…

失业找不到工作,很焦虑怎么办?

前言 最近经常看到很多人在上海找工作已经找到自我怀疑了&#xff0c;甚至把自己身上的积蓄都花光了&#xff0c;还没找到工作。 以后失业是常态&#xff0c;失业的速度也会加速。 很多人在职业生涯中都会面试失业、找工作。 目前由于求职者过多&#xff0c;就业机会少出现…

程序员保持天天快乐的6个习惯

忍不住感叹&#xff0c;我第一次对Buffer&#xff08;在社交媒体上发布最简单的方式&#xff09;有所想法已经差不多是两年前的事了。并且&#xff0c;在我有想法的一年半前&#xff0c;我还在前面那家新创公司工作的时候&#xff0c;我注意到在创立公司的时候各种模式都有&…

工作中遇到挫折是常态,怎么化解才是关键

杰瑞 提问&#xff1a; 明哥好&#xff0c;想请教一下关于保持心态的问题。在职场中经常会遇到不顺心的事&#xff1a;上下级矛盾、被客户惹恼、项目进展达不到预期等等&#xff0c;见过心态爆炸直接破口大骂的&#xff0c;见过一言不发硬着头皮坚持埋头干的&#xff0c;也见过…