Gradle

作者: hemiao3000 | 来源:发表于2022-02-26 15:58 被阅读0次

Gradle 是一种依赖管理工具<small>(和 Ant、Maven 是同一类工具)</small>,基于 Groovy 语言,面向 Java 应用为主,它抛弃了基于 XML 的各种繁琐配置,取而代之的是一种基于 Groovy 的内部「领域特定语言 <small>DSL</small>」。它提供灵活的通用构建工具,同时完美兼容Maven 仓库。

Gradle 作为第三代项目构建技术、工具,它的“名场面”是 Android 使用它<small>(替代了 Maven)</small>作为项目构建工具。

Gradle 的下载

在官网 https://gradle.org/ 可以下载 gradle 的各个版本。现列举如下:

版本 binary-only
v6.7.1 下载
v6.7 下载
v6.6.1 下载
v6.6 下载
v6.5.1 下载
v6.5 下载
v6.4.1 下载
v6.4 下载
v6.3 下载

下载后,按惯例,我们将 gradle 解压到 D:\ProgramFiles 目录下。

gradle-00

Gradle 配置

添加 Gradle 环境变量<small>(目的是未来可以在命令行中使用 gradle 命令)</small>。

gradle-01

在系统变量中新建变量 GRADLE_HOME,变量值为 gradle 的安装目录,并在 Path 变量中添加一项值:

%GRADLE_HOME%\bin
gradle-02

配置完成后打开 cmd 窗口,输入:

gradle -version

若出现版本信息则表示环境配置成功:

gradle-03

Gradle 构建系统的基本概念

项目」<small>(Project)</small>和「任务」<small>(tasks)</small>,Gradle 里的任何东西都是基于这两个基础概念。

  • 项目 通常是指我们的构建产物,比如 .jar包。<small>当然它还可以是一个 行为 ,例如:将应用程序部署到生产环境。</small>

  • 任务 是指不可分的最小工作单元,执行构建工作,比如 compile 项目或 run 测试代码。

  • 每一个构建<small>(build)</small>都是由一个或多个 project 构成的,每一个 project 是由一个或多个 tasks 构成的,一个 task 是指不可分的最小工作单元。

Build
│── Project 1
│   ├── Task a
│   ├── Task b
│   ├── ... 
│   └── Task n
│── Project 2
│── ...
└── Project n

Gradle 构建系统的组成

任何一个构建系统都是由多个构建文件组成:

  • Ant 需要你提供一个名为 build.xml 的文件;

  • Maven 需要你提供一个名为 pom.xml 的文件;

  • C 语言的 Make 需要你提供一个名为 makefile 的文件。

这些文件<small>(构建脚本)</small>定义了一系列的规则来指定项目编译流程。

Gradle 的构建系统需要你提供 2 个必要文件和 1 个非必要文件:

  • build.gradle 必需

    构建脚本。这个脚本定义了一个模块和编译用的 tasks,它一般是放在项目的模块中,也可以放在项目的根目录用来作为编译结构全局设置。

  • settings.gradle 必需

    它描述了哪一个模块需要参与构建。如果是多模块的构建,那么必须在多模块结构的根目录中加入这个设置文件。

  • gradle.properties 非必需

    用来配置构建属性。

Hello World

Gradle 是基于 Groovy 语言的构建系统,所以在构建脚本中可以使用 Groovy 语言来执行一些任务。

下面编写一个简单的 build.gradle 文件,定义一个 task 来打印 hello world,如下所示:

task hello {    // 先定义一个 hello 的 task
    doLast {    // 实现 doLast 方法。这个名字不能随便乱叫的。
        println 'Hello world!'
    }
}

然后在终端中运行 gradle hello 命令来执行这个 task,就会看到以下输入内容:

> gradle hello

// 输出结果:
> Task :hello
Hello world!

doLast 是 gradle 提供访问 task 任务的一个 API ,类似的 API 还有 doFirst

当一个 task 被执行的时候,doFirstdoLast 会在 task 本身被执行之后执行。并且,doFirst 要限于 doLast 执行,例如:

task hello {    // hello 这个 task 本身要执行的逻辑
    println 'Hello World'
}

hello.doFirst {
    println 'Hello First 1'
}

hello.doFirst {
    println 'Hello First 2'
}

hello.doLast {
    println 'Hello Last 1'
}

hello.doLast {    
    println 'Hello Last 2'
}

输入如下所示:

> gradle hello

// 输出结果
> Task :hello
Hello First 2
Hello First 1
Hello Last 1
Hello Last 2

Task 之间的依赖关系

在 Gradle 中各个 task 并不是孤立的,它们可以是相互依赖的。要让一个 task 依赖另外一个task,只需要在 task 定义时加入 dependsOn: 说明即可,被依赖的 task 会优先依赖者被执行,例如:

  • 示例一:

    task hello {
        println 'Hello'
    }
    
    task world(dependsOn: hello) {
        println "world"
    }
    

    执行结果:

    gradle world
    
    > Configure project :
    Hello
    world
    
  • 示例二:

    task hello {
        doLast {
            println 'Hello'
        }
    }
    
    task world(dependsOn: hello) {
        doLast {
            println "world"
        }
    }
    

    结果:

    gradle world
    
    > Task :hello
    Hello
    
    > Task :world
    world
    

Gradle 插件的概念

和 Maven 一样,Gradle 的所有的特性都由 Gradle 插件提供的<small>(这些插件无非就是「官方插件」和「第三方插件」的区别)</small>。

每当你使用了一个插件,这个插件会将许多 task 自动的加入到你项目里。

Gradle 本身提供了一系列的标准插件<small>(即官方插件)</small>,对于官方插件,无需多余配置只需要在你的 build.gradle 文件中的 plugins 中加入插件的 ID,例如:

plugins {
    id 'java'
}

还有一种“老式”的写法:

apply plugin: 'java'

当然,这两种写法不仅仅是新写法、老写法的问题,它们还是有一些细节上的区别的,这里,我们暂不深究。

常见的 Gradle 的 task :

  • gradle build: 编译整个项目,它会执行代码编译、代码检测和单元测试等

  • gradle assemble: 编译并打包你的代码, 但是并不运行代码检测和单元测试

  • gradle clean: 删除 build 生成的目录和所有生成的文件

  • gradle check: 编译并测试你的代码。其它的插件会加入更多的检查步骤,如使用 checkstyle、pmd、findbugs 等。

Gradle 中的 task 等价于 maven 中的「命令」。

外部依赖

通常, 一个 Java 项目将有许多外部的依赖, 既指向外部的 .jar 文件. 为了在项目里引用这些 .jar 文件, 你需要告诉 Gradle 去哪里找它们。在 Gradle 中, .jar 文件位于一个在线的中央仓库中,这里的仓库类似于 maven 的仓库。

首先,指定 maven 的仓库地址:

repositories {
    mavenCentral()
}

由于 gradle 完全兼容 maven 的中央仓库,上述的配置的作用显而易见:从 maven 中央仓库下载 .jar 包。

dependencies {
  implementation 'org.slf4j:slf4j-api:1.7.25'
  runtimeOnly 'mysql:mysql-connector-java'
  providedCompile 'javax.servlet:javax.servlet-api:4.0.1'
  testCompile 'junit:junit:4.12'
}

老式的写法并非如此,此处不展示。

  • implementation: 等同于 maven 中的 compile 依赖

  • runtimeOnly: 等同于 maven 中的 runtime 依赖

  • providedCompile: 等同于 maven 中的 provided 依赖

  • testCompile: 等同于 maven 中的 test 依赖

项目依赖

往往一个完整的项目由多个子项目构成。在 maven 中,这就是「多模块」项目。

在 gradle 中,使用文件 *settings.gradle 定义当前项目的子项目。默认情况下,每个子项目的名称对应着当前操作系统目录下的一个子目录。

include 'gradle-example-1'
include 'gradle-example-2'
include 'gradle-example-3'

可以可以简写成:

include 'gradle-example-1', 'gradle-example-2', 'gradle-example-3'

如果子项目之间有依赖关系,那么,可以写成:

dependencies {
    implementation(project(':gradle-example-1'))
    ...
}

相关文章

网友评论

      本文标题:Gradle

      本文链接:https://www.haomeiwen.com/subject/vqvxrrtx.html