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

Maven 仓库

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

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

复合 Maven 仓库

有时,POM 发布在一个位置,而 JAR 发布在另一个位置。您可以按如下方式定义此类仓库:

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")
    }
}
build.gradle
repositories {
    maven {
        // Look for POMs and artifacts, such as JARs, here
        url = "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 POM 元数据可以指定额外的仓库,但 Gradle 会忽略它们。相反,Gradle 严格只使用构建脚本中声明的仓库。

这既是可重现性保障,也是一项安全措施。如果没有此限制,更新的依赖项版本可能会意外地将来自未经验证源的构件引入到您的构建中。

经过身份验证的 Maven 仓库

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

本地 Maven 仓库

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

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

Gradle 可以从本地 Maven 仓库使用依赖项。这对于希望在发布插件之前在本地测试其设置的团队很有用。

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

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

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

不推荐使用 mavenLocal() 的原因

通常,您应避免在 Gradle 构建中将 mavenLocal() 添加为仓库。依赖它存在几个问题:

  1. 不是真正的仓库,只是缓存:

    • Maven 将 mavenLocal() 视为缓存,而不是可靠的仓库。

    • 它可能包含不完整的模块(例如,缺少源文件或 Javadoc 文件),从而导致 Gradle 在解析依赖项时出现问题。

  2. 信任和安全问题

    • Gradle 信任本地仓库,因为无法验证构件的来源。

    • 依赖项可以轻松被覆盖,从而带来安全、正确性和可重现性方面的风险。

  3. 性能下降

    • 由于元数据和构件可以随时更改(参见第 2 项),Gradle 禁用本地仓库的缓存

    • 这会导致构建速度变慢——特别是当 mavenLocal() 声明在远程仓库之前时,因为 Gradle 会首先检查它。

尽管存在缺点,但在极少数情况下 mavenLocal() 仍然有用:

  1. 与 Maven 的互操作性:

    • 示例:如果项目 A (Maven)项目 B (Gradle) 在开发过程中共享构件,mavenLocal() 可以充当临时桥梁。

    • 最好使用内部仓库,但如果不可行,请将 mavenLocal() 限制为仅用于本地构建。

  2. 与 Gradle 的互操作性(多仓库开发):

    • 示例:如果您需要验证项目 A 的更改是否适用于项目 B,则可以使用 mavenLocal()

    • 首选复合构建以获得更好的依赖解析。

    • 仅在万不得已时使用 mavenLocal()

为了降低风险,请考虑使用仓库过滤器将 mavenLocal() 限制为特定依赖项:

repositories {
    mavenLocal {
        content {
            includeGroup("com.example.myproject") // Only allow this group from mavenLocal
        }
    }
}

这确保 mavenLocal() 仅用于预期依赖项,并避免意外的解析问题。

Ivy 仓库

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

标准布局 Ivy 仓库

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

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

命名布局 Ivy 仓库

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

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

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

自定义模式布局 Ivy 仓库

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

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

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

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")
        }
    }
}
build.gradle
repositories {
    ivy {
        url = "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 风格布局,其中斜杠替换点:

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

经过身份验证的 Ivy 仓库

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

本地 Ivy 仓库

Gradle 可以从本地 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")
    }
}

平面目录仓库

有些项目将依赖项存储在共享驱动器上或项目源代码中,而不是使用二进制仓库。要将平面文件系统目录用作仓库,您可以按如下方式进行配置:

build.gradle.kts
repositories {
    flatDir {
        dirs("lib")
    }
    flatDir {
        dirs("lib1", "lib2")
    }
}
build.gradle
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,它将使用后者的元数据。