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。您使用二进制存储库来避免直接访问jcenter
或mavenCentral
。将您的 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.gradle
或 settings.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