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

剖析典型的构建脚本

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

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

repositories {
    mavenCentral()
}

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

repositories {
    mavenCentral()
}

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

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

要详细了解如何定义依赖项,请参阅声明依赖项

使用依赖项配置

配置是一组命名的依赖项和工件。配置有三个主要用途

声明依赖项

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

解析依赖项

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

公开工件以供使用

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

牢记这三个用途,让我们来看一下Java 库插件定义的几个标准配置

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 "../local-repo"
    }
}

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

要详细了解如何定义存储库,请参阅 声明存储库

发布工件

要详细了解如何发布工件,请参阅 发布插件