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 缓存的位置。如果在用户主目录 (~/.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"
        }
    }
}

可选地,您可以为“organisation”部分启用 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,它将使用后者的元数据。