Gradle中的依赖管理

2025/04/30

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'
}

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

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

Gradle构建从Maven Central仓库中提取所有依赖,如repositories块所定义。

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

3. 依赖配置

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

3.1 如何声明依赖关系

首先,配置分为4 个部分:

  • group:组织、公司或项目的标识符
  • name:依赖标识符
  • version:我们要导入的版本
  • classifier:用于区分具有相同组、名称和版本的依赖

我们可以用两种格式声明依赖,约定格式允许我们将依赖声明为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的最新版本已弃用一些配置,例如compile、testCompile、runtime和testRuntime,但在撰写本文时,它们仍然可用。

4. 外部依赖的类型

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

4.1 模块依赖关系

基本上,声明依赖的最常见方式是引用仓库,Gradle仓库是按组、名称和版本组织的模块集合。

事实上,Gradle从仓库块内的指定仓库中提取依赖:

repositories {
    mavenCentral()
}

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

4.2 文件依赖关系

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

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

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

类似地,我们可以使用filetree将jar文件的层次结构包含在目录中:

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

4.3 项目依赖关系

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

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

dependencies { 
    implementation project(':shared') 
}

4.4 Gradle依赖

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

dependencies {
    implementation gradleApi()
}

5. buildScript

正如我们之前所见,我们可以在dependency块中声明源代码和测试的外部依赖。同样,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'
}

6. 总结

在本文中,我们研究了Gradle依赖、如何声明它们以及不同的配置类型。

Show Disqus Comments

Post Directory

扫码关注公众号:Taketoday
发送 290992
即可立即永久解锁本站全部文章