Contents

Gradle的依赖管理

1. 概述

在本教程中,我们将研究在 Gradle 构建脚本中声明依赖项。对于我们的示例,我们将使用Gradle 6.7

2. 典型结构

让我们从Java 项目 的简单 Gradle 脚本开始:

plugins {
    id 'java'
}
repositories {
    mavenCentral()
}
dependencies {
    implementation 'org.springframework.boot:spring-boot-starter:2.3.4.RELEASE'
    testImplementation 'org.springframework.boot:spring-boot-starter-test:2.3.4.RELEASE'
}

如上所示,我们有三个代码块:plugins、 repositories和 dependencies

首先,plugins块告诉我们这是一个 Java 项目。其次,dependencies块声明了2.3.4 版本。释放编译项目生产源代码所需的spring-boot-starter依赖项。此外,它还指出项目的测试套件需要spring-boot-starter-test才能编译。

Gradle 构建从 Maven 中央存储库中提取所有依赖项,由repositories块定义。

让我们关注如何定义依赖关系。

3. 依赖配置

我们可以在不同的配置中声明依赖项。在这方面,我们可以选择或多或少精确,稍后我们会看到。

3.1. 如何声明依赖

首先,配置有 4 个部分:

  • group – 组织、公司或项目的标识符
  • name - 依赖标识符
  • version – 我们要导入的
  • classifier — 用于区分具有相同group、 nameversion的依赖项

我们可以用两种格式声明依赖关系。收缩格式允许我们将依赖项声明为 String

implementation 'org.springframework.boot:spring-boot-starter:2.3.4.RELEASE'

相反,扩展格式允许我们将其编写为Map

implementation group: 'org.springframework.boot', name: 'spring-boot-starter', version: '2.3.4.RELEASE'

3.2. 配置类型

此外,Gradle 提供了许多依赖配置类型:

  • api – 用于使依赖项显式化并在类路径中公开它们。例如,当实现一个对图书馆消费者透明的图书馆时
  • implementation — 编译生产源代码所必需的,纯粹是内部的。它们不会暴露在包装之外
  • compileOnly – 当它们只需要在编译时声明时使用,例如源注解或注解处理器。它们不会出现在运行时类路径或测试类路径中
  • compileOnlyApi – 在编译时需要以及需要在类路径中对消费者可见时使用
  • runtimeOnly – 用于声明仅在运行时需要且在编译时不可用的依赖
  • testImplementation – 编译测试所需
  • testCompileOnly – 仅在测试编译时需要
  • testRuntimeOnly – 仅在测试运行时需要

我们应该注意到,最新版本的 Gradle 弃用了一些配置,如compiletestCompileruntimetestRuntime。在撰写本文时,它们仍然可用。

4. 外部依赖的类型

让我们深入研究在 Gradle 构建脚本中遇到的外部依赖项的类型。

4.1. 模块依赖

基本上,声明依赖项的最常见方法是引用存储库。Gradle 存储库是按group、 name和 version组织的模块集合。

事实上,Gradle 会从repositories块中的指定存储库中拉取依赖项:

repositories {
    mavenCentral()
}
dependencies {
    implementation 'org.springframework.boot:spring-boot-starter:2.3.4.RELEASE'
}

4.2. 文件依赖

鉴于项目并不总是使用自动依赖管理,一些项目将依赖组织作为源代码或本地文件系统的一部分。因此,我们需要指定依赖项所在的确切位置。

为此,我们可以使用files来包含依赖项集合:

dependencies {
    runtimeOnly files('libs/lib1.jar', 'libs/lib2.jar')
}

同样,我们可以使用filetree在目录中包含jar文件的层次结构:

dependencies {
    runtimeOnly fileTree('libs') { include '*.jar' }
}

4.3. 项目依赖

由于一个项目可以依赖另一个项目来重用代码,Gradle 为我们提供了这样做的机会。

假设我们要声明我们的项目依赖于shared项目:

dependencies { 
    implementation project(':shared') 
}

4.4. Gradle 依赖项

在某些情况下,例如开发任务或插件,我们可以定义属于我们正在使用的 Gradle 版本的依赖项:

dependencies {
    implementation gradleApi()
}

5. buildScript

正如我们之前看到的,我们可以在依赖项块中声明源代码和测试的外部依赖项。同样,buildScript块允许我们声明 Gradle 构建的依赖项,例如第三方插件和任务类。特别是,如果没有buildScript块,我们只能使用 Gradle 开箱即用的功能。

下面我们声明我们要通过从 Maven Central 下载来使用Spring Boot 插件

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'org.springframework.boot:spring-boot-gradle-plugin:2.3.4.RELEASE' 
    }
}
apply plugin: 'org.springframework.boot'

因此,我们需要指定下载外部依赖项的来源,因为没有默认来源。

上述内容与旧版本的 Gradle 有关。相反,在较新的版本中,可以使用更简洁的形式:

plugins {
    id 'org.springframework.boot' version '2.3.4.RELEASE'
}