使用 gradle 解决代理存储库上的 ivy 依赖关系会导致资源丢失

Posted

技术标签:

【中文标题】使用 gradle 解决代理存储库上的 ivy 依赖关系会导致资源丢失【英文标题】:Resolving ivy dependencies on a proxied repository with gradle leads to missing resources 【发布时间】:2014-05-19 13:44:05 【问题描述】:

我们设置了主-从存储库方法,将 nexus pro 作为主机,将 nexus pro 作为从机,其中我们的快照和发布存储库被配置为代理(此外使用 sonatype nexus 的 smartproxy 技术)。

我们的项目是基于 Gradle 和 Ivy 的多项目构建。我们使用动态版本(例如 1.+)来定义和解决依赖关系。

问题在于无法在代理上解析工件,该代理已正确发布到主存储库并且没有转发到从(代理)存储库(例如,由于网络问题或从存储库可以在给定工件发布后设置)。

我发现(参见docu in gradle),gradle 依赖解析器使用目录列表:

如果依赖项被声明为动态版本(如 1.+),Gradle 会将其解析为存储库中最新的可用静态版本(如 1.2)。对于 Maven 存储库,这是使用 maven-metadata.xml 文件完成的,而对于 Ivy 存储库,这是通过目录列表完成的。

不幸的是,由于该工件和目录结构不可用,解析过程失败。调用gradle --info --refresh-dependencies结果到

Executing task ':resolve' (up-to-date check took 0.001 secs) due to:
Task has not declared any outputs.
Resource missing. [HTTP GET:     http://proxy/nexus/content/repositories/testrepo/com/company/smpro/test/SmartproxyTest/]
:resolve FAILED
:resolve (Thread[main,5,main]) completed. Took 0.668 secs.

我原以为 Nexus 正在解析主服务器上的那个 URL,工件列表可以通过目录列表获得,但事实并非如此。如果我将上面的 URL 放入浏览器,我会得到 404:

404 - ItemNotFoundException
Request is marked as local-only, remote access not allowed from M2Repository(id=testrepo)

如果我在主仓库中调用它,它当然可以工作。

我现在的问题:有任何线索,为什么这不能通过代理在主服务器上解决,通常应该这样做?

谢谢, 弗雷德

【问题讨论】:

【参考方案1】:

Nexus 代理存储库填充其本地磁盘存储以响应对远程文件的请求。只有通过代理请求的文件才会存储在它的磁盘缓存中。

因此,通过代理通过目录列表进行解析并不能很好地工作。

从您的请求路径看来,您可能正在使用 Nexus Professional 智能代理功能。如果是这样,您可以通过在代理的“智能代理”选项卡中选择“立即下载更新的工件”来部分解决此问题。这不适用于尚未下载的工件。

【讨论】:

感谢您的回复。问题是,正如您所提到的,smartproxy 功能不适用于尚未下载到代理的任何工件,但如果网络连接中断并导致代理上的工件丢失,则也不起作用。由于我们遇到了这个问题,我们希望以最少的努力解决这个问题。不幸的是,nexus 代理上的工件解析似乎不支持以这种方式列出的 ivy 项目,而普通和花园的 maven repo 代理则支持。这不好。

以上是关于使用 gradle 解决代理存储库上的 ivy 依赖关系会导致资源丢失的主要内容,如果未能解决你的问题,请参考以下文章

将 Gradle 与自定义 Ivy 存储库一起使用

Gradle 搜索 Ivy 服务但未定义 Ivy 配置/存储库

如何使用自定义 gradle 插件而不将其发布到 maven/ivy 存储库?

创建私有远程 Ivy 存储库

StackBlitz ngcc 在启用 Ivy 的情况下无法在我的 npm 库上运行

Nexus OSS 是不是支持 Ivy 存储库的代理?