本章介绍如何将基本的依赖管理概念应用于基于 JVM 的项目。有关依赖管理的详细介绍,请参阅 Gradle 中的依赖管理

剖析典型的构建脚本

让我们来看一个非常简单的基于 JVM 的项目的构建脚本。它应用了 Java Library 插件,该插件自动引入了标准项目布局,提供了执行典型工作的任务以及对依赖管理的充分支持。

build.gradle.kts
plugins {
    `java-library`
}

repositories {
    mavenCentral()
}

dependencies {
    implementation("org.hibernate:hibernate-core:3.6.7.Final")
    testImplementation("junit:junit:4.+")
    api("com.google.guava:guava:23.0")
}
build.gradle
plugins {
    id 'java-library'
}

repositories {
    mavenCentral()
}

dependencies {
    implementation 'org.hibernate:hibernate-core:3.6.7.Final'
    testImplementation 'junit:junit:4.+'
    api 'com.google.guava:guava:23.0'
}

Project.dependencies{} 代码块声明编译项目的生产源代码需要 Hibernate core 3.6.7.Final。它还声明编译项目的测试代码需要 junit >= 4.0。所有依赖都应该在 Maven Central 仓库中查找,如 Project.repositories{} 所定义的那样。以下各节更详细地解释了每个方面。

声明模块依赖

您可以声明各种依赖类型。其中一种类型是模块依赖模块依赖表示对在当前构建之外构建的特定版本模块的依赖。模块通常存储在仓库中,例如 Maven Central、企业 Maven 或 Ivy 仓库,或本地文件系统中的目录。

要定义模块依赖,您可以将其添加到依赖配置

build.gradle.kts
dependencies {
    implementation("org.hibernate:hibernate-core:3.6.7.Final")
}
build.gradle
dependencies {
    implementation 'org.hibernate:hibernate-core:3.6.7.Final'
}

要了解有关定义依赖的更多信息,请查看声明依赖

使用依赖配置

Configuration 是依赖项和工件的命名集合。配置主要有三个目的

声明依赖

插件使用配置,以便构建作者可以轻松声明插件定义的任务执行期间各种目的所需的其他子项目或外部工件。例如,插件可能需要 Spring Web 框架依赖来编译源代码。

解析依赖

插件使用配置来查找(并可能下载)其定义的任务的输入。例如,Gradle 需要从 Maven Central 下载 Spring Web 框架 JAR 文件。

暴露工件以供使用

插件使用配置来定义它为其他项目生成的工件以供使用。例如,项目希望将其打包在 JAR 文件中的已编译源代码发布到内部 Artifactory 仓库。

考虑到这三个目的,让我们看一下 Java Library 插件定义的标准配置中的几个。

implementation

编译项目生产源代码所需的依赖项,这些依赖项不是项目公开的 API 的一部分。例如,项目使用 Hibernate 作为其内部持久层实现。

api

编译项目生产源代码所需的依赖项,这些依赖项项目公开的 API 的一部分。例如,项目使用 Guava,并在其方法签名中公开带有 Guava 类的公共接口。

testImplementation

编译和运行项目测试源代码所需的依赖项。例如,项目决定使用 JUnit 测试框架编写测试代码。

各种插件添加了更多标准配置。您还可以在构建中通过 Project.configurations{} 定义自己的自定义配置。有关定义和自定义依赖配置的详细信息,请参阅什么是依赖配置

声明常见的 Java 仓库

Gradle 如何知道在哪里查找外部依赖的文件?Gradle 在仓库中查找它们。仓库是模块的集合,按 groupnameversion 组织。Gradle 理解不同的仓库类型,例如 Maven 和 Ivy,并支持通过 HTTP 或其他协议访问仓库的各种方式。

默认情况下,Gradle 不定义任何仓库。您需要借助 Project.repositories{} 定义至少一个仓库,然后才能使用模块依赖。一种选择是使用 Maven Central 仓库

build.gradle.kts
repositories {
    mavenCentral()
}
build.gradle
repositories {
    mavenCentral()
}

您还可以在本地文件系统上拥有仓库。这适用于 Maven 和 Ivy 仓库。

build.gradle.kts
repositories {
    ivy {
        // URL can refer to a local directory
        url = uri("../local-repo")
    }
}
build.gradle
repositories {
    ivy {
        // URL can refer to a local directory
        url = file("../local-repo")
    }
}

一个项目可以有多个仓库。Gradle 将按照指定的顺序在每个仓库中查找依赖项,并在包含请求模块的第一个仓库处停止。

要了解有关定义仓库的更多信息,请查看声明仓库

发布工件

要了解有关发布工件的更多信息,请查看发布插件