gradle 是不是可以使用优先级高于 jcenter 的 maven 存储库

Posted

技术标签:

【中文标题】gradle 是不是可以使用优先级高于 jcenter 的 maven 存储库【英文标题】:Is gradle possible to use maven repository with higher priority than jcentergradle 是否可以使用优先级高于 jcenter 的 maven 存储库 【发布时间】:2016-02-05 07:51:47 【问题描述】:

Gradle 可以设置多个存储库,例如maven 和 jcenter。但是我意识到 gradle 总是先使用 jcenter 即使我把 maven 放在 jcenter 之前(如下所示)。是否可以让 maven(本地 repo 和更快)具有更高的优先级?

## in file build.gradle
allprojects 
    repositories 
    maven  url "http://nexus.mucompany.com/nexus/service/local/repositories/releases/content/" 
    jcenter()

【问题讨论】:

我今天刚刚回复了very similar question。您使用二进制存储库来避免直接访问jcentermavenCentral。将您的 Nexus 配置为代理 jcenter 并仅使用它。 简化配置和使用是个好主意。我会尝试。谢谢。 非常欢迎您对链接问题的答案进行投票 :) 【参考方案1】:

我想将此作为评论提出,但还没有足够的代表:-/

您能否发布来自 gradle --debug 的输出,让您认为它优先从 jcenter 解决?

gradle docs 包含以下内容:

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

本地的快速确认显示自定义 maven 存储库和 jcenter() 之间的订单正在兑现

【讨论】:

在上面添加gradle调试日志(部分日志)。它显示了按顺序搜索 5 个 repo,MavenLocal、maven、BintrayJcenter、maven2 和 maven3。我的 maven local 和我公司的 maven repo 没有所需的 jar,所以它总是转到 jcenter。 添加上一条评论原来添加的日志:pastebin 查看日志(上图),您似乎拥有的不仅仅是问题中指定的两个存储库。也许您添加了一些额外的存储库(可能在您的项目或主目录中某处出现错误的 init.gradlesettings.gradle,或者自定义企业插件正在添加它们)。相比之下,我使用两个 repos 构建的干净 gradle 会给出以下输出:18:17:20.637 [DEBUG] [org.gradle.api.internal.artifacts.ivyservice.ivyresolve.RepositoryChainComponentMetaDataResolver] Attempting to resolve component for joda-time:joda-time:2.9 using repositories [BintrayJCenter, maven]【参考方案2】:

除此之外,至少在较新的 gradle 版本中,顺序很重要:

考虑到存储库的顺序很重要,这一点更为重要。

✨ 声明的顺序决定了 Gradle 在运行时如何检查依赖项。如果 Gradle 在特定存储库中找到模块描述符,它将尝试从同一存储库下载该模块的所有工件。您可以详细了解Gradle’s resolution mechanism 的内部工作原理。

来源:gradle 5.4.1 Declaring multiple repositories

或者这是您特定 gradle 版本中的错误 - 我的回答可能会在 2k19 那天“有点晚”,因为您的问题来自 15 年;D

(至少在 Gradle 3.5 中定义类似

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

来源:gradle 3.5 Dependency Management for Java Projects )

一个常见问题是,更高优先级的存储库和/或本地缓存已损坏! 通常有足够多的人工 jcenter 代理包含不情愿的 POM 声明,但没有 jars。然后,您必须清理工件。 类似于本地存储库。

您可以尝试通过在 --refresh-dependencies 和最佳情况下启用 -i 日志记录的情况下运行 gradle 来忽略本地缓存,以查看请求的去向和结果。

看看How can I force gradle to redownload dependencies?


第二个选项: as of gradle 5.1你总是可以声明过滤器

查看 gradle 5.4.1 Declaring a repository filter

对我来说,我忽略了来自 jcenter 的任何 com.android 包,这会加快搜索速度并减少上面提到的已知问题

【讨论】:

我更喜欢这个答案,而不是这个问题的公认答案。从安全的角度来看,依赖于存储库顺序的 gradle 特性的问题可能是危险的,即即使在我公司的私人 maven 存储库中克隆了标准 jar 并在我的公司报告中将此存储库列为最重要的顺序无法访问,gradle 将默默地回退到公共 repo,因此可能会从我们决定不持久信任的 repos 下载。使用 gradle 5.4.1 插件声明存储库过滤器似乎更好地避免这种情况。

以上是关于gradle 是不是可以使用优先级高于 jcenter 的 maven 存储库的主要内容,如果未能解决你的问题,请参考以下文章

Gradle 错误:找不到 com.android.tools.build:gradle:6.6.1

我可以为普通优先级进程设置单个线程的优先级高于 15 吗?

极光推送sdk使用

Zuul 路由优先级高于 Spring Controller

优先组高于闭包

SPA中,Node路由优先级高于React路由