4

当从 Internet 上的公共存储库(如 Maven Central)下载工件时,我想让 Nexus(或 Artifactory,我们尚未决定)存储工件的副本。

基本上,如果您的本地存储库中没有 jar 并且存储库管理器也没有它,我想向存储库管理器询问 jar,让它发送给我,并将其存储在存储库中经理和我当地的回购。然后,当另一个人向 repo manager 询问同一个 jar 时,它会从 repo manager 将其发送给他们,然后他们将其保存在本地 repo 中,而无需访问 Maven Central。

这听起来像是开箱即用的工作方式,但我看不到。我可以通过 repo 管理器查看 Maven 中心上的工件,但是当我使用 Netbeans 向我的项目添加依赖项时,它会直接从 Maven 中心下载它(显然)。回购管理器中没有缓存任何内容(据我所知)。

4

3 回答 3

5

Nexus 具有代理存储库的概念,它几乎完全符合您的描述。有关详细信息,请参阅本书的代理公共存储库部分。

Artifactory 有一个类似的功能,称为虚拟存储库

代理和缓存远程公共存储库可以通过减少公共 Internet 上的冗余下载来加快构建速度。如果您组织中的开发人员需要下载 Spring Framework 2.5 版并且您使用的是 Nexus,则只需从远程存储库下载一次依赖项(以及依赖项的依赖项)。对于 Internet 的高速连接,这似乎是一个小问题,但如果您经常要求您的开发人员下载数百兆字节的第三方依赖项,那么真正节省的成本将是 Maven 花费的时间检查新版本的依赖项并通过公共 Internet 下载依赖项。

您可以通过将存储库管理器设置为中央的镜像来阻止您的 Maven 安装尝试连接到中央,然后将对中央的请求定向到您的存储库管理器。例如,将以下内容添加到<mirrors>Maven 的 settings.xml 部分,以将请求重定向到您的存储库管理器的中心:

<mirror>
  <id>central-proxy</id>
  <mirrorOf>central</mirrorOf>
  <url>http://myrepo/nexus/content/groups/public</url>
</mirror>

我倾向于建立一个包含多个远程存储库的存储库组。就我的 Maven 安装而言,该组充当单个存储库,但会整理来自多个远程存储库的工件。

于 2009-09-25T16:00:24.763 回答
2

来自其他公共存储库的代理和缓存工件确实(或应该)内置在任何体面的企业存储库管理器中。在企业环境中,即使公共存储库关闭,开发团队也应该能够开发和构建他们的软件。这是一个非常基本的用例,也是使用公司存储库的原因之一(不依赖于您无法控制的公共资源)。

安装和配置存储库管理器后,您需要配置 maven 以检查存储库而不是公共存储库。为此,请在您的~/.m2/settings.xml. 请参阅第3.2 节。配置 Maven 以使用 Nexus Book 的单个 Nexus 组以获取更多详细信息(该配置适用于任何存储库管理器)。

在企业环境中,我更喜欢通过镜像所有存储库请求来强制 Maven 使用单个存储库。为此,请设置为.mirrorOf*

<settings>
  ...
  <mirrors>
    <mirror>
      <id>nexus</id>
      <mirrorOf>*</mirrorOf>
      <name>Maven Repository Manager running on repo.mycompany.com</name>
      <url>http://repo.mycompany.com/proxy</url>
    </mirror>
  </mirrors>
  ...
</settings>
于 2009-09-25T16:58:28.687 回答
1

在 Artifactory 中,您可以使用“主页->Maven 设置”页面下载 maven 设置,该设置将强制 maven 仅使用您选择的 Artifactory 虚拟存储库。这与虚拟存储库中的存储库引用清理相结合,将确保您永远不会查询 maven Central。

您的 NetBeans 问题可以通过在 Maven 安装中强制执行 repo 声明来解决。上次使用 NetBeans Maven 支持时,我还指定了一个项目级别的 settings.xml 文件来涵盖所有情况。

旁注:使用 mirrorOf 功能非常粗鲁,可能会导致奇怪的行为。

于 2011-03-03T16:07:08.817 回答