Gradle 支持多种来源解析依赖,适应不同的元数据格式和连接方式。您可以从以下位置解析依赖:

Maven 仓库

许多组织在 Maven 仓库中托管依赖。Gradle 可以通过指定 URL 来声明 Maven 仓库

KotlinGroovy
build.gradle.kts
repositories {
    maven {
        url = uri("http://repo.mycompany.com/maven2")
    }
}

复合 Maven 仓库

有时,POM 发布在一个位置,而 JAR 发布在另一个位置。您可以如下定义这样的仓库

KotlinGroovy
build.gradle.kts
repositories {
    maven {
        // Look for POMs and artifacts, such as JARs, here
        url = uri("http://repo2.mycompany.com/maven2")
        // Look for artifacts here if not found at the above location
        artifactUrls("http://repo.mycompany.com/jars")
        artifactUrls("http://repo.mycompany.com/jars2")
    }
}

Gradle 将首先在基本 URL 查找 POM 和工件,如果找不到工件,它将检查额外的 artifactUrls。

身份验证的 Maven 仓库

您可以为需要身份验证的 Maven 仓库指定凭据。有关身份验证选项,请参阅支持的仓库协议

本地 Maven 仓库

Gradle 可以从本地 Maven 仓库(即本地文件系统上的仓库)使用依赖。

KotlinGroovy
build.gradle.kts
repositories {
    maven {
        url = uri(layout.buildDirectory.dir("repo"))
    }
}

Gradle 可以从本地 Maven 仓库使用依赖。这对于希望在本地测试其设置,然后再发布其插件的团队非常有用。

在将 mavenLocal() 添加到构建脚本之前,您应确保使用本地 Maven 仓库是必要的

KotlinGroovy
build.gradle.kts
repositories {
    mavenLocal()
}
即使您从远程 Maven 仓库解析依赖,Gradle 也会管理自己的缓存,而无需声明本地 Maven 仓库。

Gradle 使用与 Maven 相同的逻辑来识别本地 Maven 缓存的位置。如果在用户的 home 目录 (~/.m2/settings.xml) 中定义了 settings.xml 文件,则此位置优先于 M2_HOME/conf。否则,Gradle 默认使用 ~/.m2/repository

作为一般建议,请避免使用 mavenLocal()。与 Maven 构建不同,Gradle 可以使用项目依赖在项目之间共享工件。对于在项目之间共享工件,无需发布到本地 maven 仓库。

Ivy 仓库

许多组织在 Ivy 仓库中托管依赖。

标准布局 Ivy 仓库

要声明具有标准布局的 Ivy 仓库,只需指定 URL 即可

KotlinGroovy
build.gradle.kts
repositories {
    ivy {
        url = uri("http://repo.mycompany.com/repo")
    }
}

命名布局 Ivy 仓库

您可以指定您的仓库遵循 Ivy 默认布局

KotlinGroovy
build.gradle.kts
repositories {
    ivy {
        url = uri("http://repo.mycompany.com/repo")
        layout("maven")
    }
}

有效的命名布局值包括 gradle(默认)、mavenivy。有关更多详细信息,请参阅 API 文档中的 IvyArtifactRepository.layout(java.lang.String)

自定义模式布局 Ivy 仓库

要定义具有非标准布局的 Ivy 仓库,您可以设置模式布局

KotlinGroovy
build.gradle.kts
repositories {
    ivy {
        url = uri("http://repo.mycompany.com/repo")
        patternLayout {
            artifact("[module]/[revision]/[type]/[artifact].[ext]")
        }
    }
}

对于从不同位置获取 Ivy 文件和工件的 Ivy 仓库,请定义单独的模式

KotlinGroovy
build.gradle.kts
repositories {
    ivy {
        url = uri("http://repo.mycompany.com/repo")
        patternLayout {
            artifact("3rd-party-artifacts/[organisation]/[module]/[revision]/[artifact]-[revision].[ext]")
            artifact("company-artifacts/[organisation]/[module]/[revision]/[artifact]-[revision].[ext]")
            ivy("ivy-files/[organisation]/[module]/[revision]/ivy.xml")
        }
    }
}

(可选)您可以为“组织”部分启用 Maven 样式布局,其中正斜杠替换点号

KotlinGroovy
build.gradle.kts
repositories {
    ivy {
        url = uri("http://repo.mycompany.com/repo")
        patternLayout {
            artifact("[organisation]/[module]/[revision]/[artifact]-[revision].[ext]")
            setM2compatible(true)
        }
    }
}

身份验证的 Ivy 仓库

您可以为需要身份验证的 Ivy 仓库指定凭据。有关身份验证选项,请参阅支持的仓库协议

本地 Ivy 仓库

Gradle 可以从本地 Ivy 仓库(即本地文件系统上的仓库)使用依赖

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

扁平目录仓库

有些项目将依赖项存储在共享驱动器或项目源代码中,而不是使用二进制仓库。要使用扁平文件系统目录作为仓库,您可以像这样配置它

KotlinGroovy
build.gradle.kts
repositories {
    flatDir {
        dirs("lib")
    }
    flatDir {
        dirs("lib1", "lib2")
    }
}

此配置添加了在指定目录中搜索依赖项的仓库。

不建议使用扁平目录仓库,因为它们不支持 Ivy XML 或 Maven POM 文件等元数据格式。

通常,二进制依赖项应来自外部仓库,但如果外部存储依赖项不是一种选择,则最好使用本地文件 URL 声明 Maven 或 Ivy 仓库。

从扁平目录仓库解析依赖项时,Gradle 会根据工件的存在动态生成临时依赖项元数据。Gradle 优先选择具有真实元数据的模块,而不是扁平目录仓库生成的模块。因此,扁平目录无法覆盖来自其他声明仓库的具有真实元数据的工件。

例如,如果 Gradle 在扁平目录中找到 jmxri-1.2.1.jar,而在另一个仓库中找到 jmxri-1.2.1.pom,它将使用后者的元数据。