【问题标题】:What is the repository order that is considers by Maven when it tries to download plugins?Maven 在尝试下载插件时考虑的存储库顺序是什么?
【发布时间】:2020-07-20 04:13:40
【问题描述】:

我找不到 documentation Maven 说明它如何订购声明的存储库的地方。

考虑以下可以配置 maven 存储库的位置:

  • settings.xmlsettings/profiles/profile/repositories
    • id:设置-repo1
    • id:设置-repo2
  • settings.xmlsettings/mirrors
    • id:设置-mirror1
    • id:设置-mirror2
  • pom.xmlproject/repositories
    • id: pom-parent-repo1
    • id: pom-parent-repo2
  • pom.xmlproject/repositories
    • id: pom-child-repo1
    • id: pom-child-repo2
  • pom.xml 的依赖项也使用存储库:
    • id:依赖-repo1
    • id:依赖-repo2

Maven 尝试从所有这些存储库下载依赖项的顺序是什么?

mvn dependency:list-repositories 命令向我显示了一个非常无序的列表,很难相信这是真正的优先顺序。

【问题讨论】:

  • 定义这么多存储库有什么原因吗?这是企业环境吗?
  • 正确!我们使用相同的代码库进行本地开发。但是一旦部署在 CI/CD 或生产中,所有东西都必须来自 2-3 个公司存储库(嗯,它都是一个具有多个存储库的大型 Artifactory),它们是:“blah blah blah”(如:验证、扫描、安全检查、审核等)。在堆栈中还拥有银行环境的好处。 ;)
  • @khmarbaise 但现实世界并没有上面例子中的广告那么糟糕。这只是为了完整性和理解。

标签: maven repository maven-dependency


【解决方案1】:

我执行以下操作来确定 Maven 考虑存储库顺序的顺序:

  • 我将所有 XML 文件中所有存储库/镜像设置的 URL 更新为无效的 Maven 存储库,以强制 Maven 失败
  • 我跑了mvn compile

以下结果假设某个依赖项从未在本地缓存~/.m2/repository 中下载/注册(即它没有被缓存或之前没有使用其他存储库失败)。如果您在本地缓存中有某个依赖项的条目,Maven 将重用该缓存条目(它还保存初始源存储库)来尝试再次获取它。

这是 Maven 在没有配置镜像时尝试的:

Downloading from settings-repo1: http://settings-repo1.org/org/apache/httpcomponents/httpclient1/4.5.6/httpclient1-4.5.6.pom
Downloading from settings-repo2: http://settings-repo2.org/org/apache/httpcomponents/httpclient1/4.5.6/httpclient1-4.5.6.pom
Downloading from pom-child-repo1: http://child-repo1.org/org/apache/httpcomponents/httpclient1/4.5.6/httpclient1-4.5.6.pom
Downloading from pom-child-repo2: http://child-repo2.org/org/apache/httpcomponents/httpclient1/4.5.6/httpclient1-4.5.6.pom
Downloading from pom-parent-repo1: http://parent-repo1.org/org/apache/httpcomponents/httpclient1/4.5.6/httpclient1-4.5.6.pom
Downloading from pom-parent-repo2: http://parent-repo2.org/org/apache/httpcomponents/httpclient1/4.5.6/httpclient1-4.5.6.pom
Downloading from central: https://repo.maven.apache.org/maven2/org/apache/httpcomponents/httpclient1/4.5.6/httpclient1-4.5.6.pom

当配置了镜像时:

Downloading from settings-repo1: http://settings-repo1.org/org/apache/httpcomponents/httpclient1/4.5.6/httpclient1-4.5.6.pom
Downloading from settings-repo2: http://settings2.org/org/apache/httpcomponents/httpclient1/4.5.6/httpclient1-4.5.6.pom
Downloading from settings-mirror1: http://settings-mirror1.org/org/apache/httpcomponents/httpclient1/4.5.6/httpclient1-4.5.6.pom
Downloading from settings-mirror2: http://settings-mirror2.org/org/apache/httpcomponents/httpclient1/4.5.6/httpclient1-4.5.6.pom
Downloading from pom-parent-repo1: http://parent-repo1.org/org/apache/httpcomponents/httpclient1/4.5.6/httpclient1-4.5.6.pom
Downloading from pom-parent-repo2: http://parent-repo2.org/org/apache/httpcomponents/httpclient1/4.5.6/httpclient1-4.5.6.pom
Downloading from central: https://repo.maven.apache.org/maven2/org/apache/httpcomponents/httpclient1/4.5.6/httpclient1-4.5.6.pom

所以顺序必须是:

  • settings.xml
  • 当前项目的pom.xml
  • 父项目的pom.xml

如果配置了任何镜像,它们只会替换由mirrorOf 元素标识的原始列表中的相应存储库。如果mirrorOf 表达式标识了多个存储库,则仅尝试第一次出现(在没有配置镜像的 Maven 原始顺序中)。例如,如果有一个镜像(例如settings-mirror1)配置为:<mirrorOf>pom-parent-repo2,pom-child-repo1</mirrorOf>,则存储库搜索顺序将为:

Downloading from settings-repo1: http://settings-repo1.org/org/apache/httpcomponents/httpclient1/4.5.6/httpclient1-4.5.6.pom
Downloading from settings-repo2: http://settings-repo2.org/org/apache/httpcomponents/httpclient1/4.5.6/httpclient1-4.5.6.pom
Downloading from settings-mirror1: http://settings-mirror1.org/org/apache/httpcomponents/httpclient1/4.5.6/httpclient1-4.5.6.pom
Downloading from pom-child-repo2: http://child-repo2.org/org/apache/httpcomponents/httpclient1/4.5.6/httpclient1-4.5.6.pom
Downloading from pom-parent-repo1: http://parent-repo1.org/org/apache/httpcomponents/httpclient1/4.5.6/httpclient1-4.5.6.pom
Downloading from central: https://repo.maven.apache.org/maven2/org/apache/httpcomponents/httpclient1/4.5.6/httpclient1-4.5.6.pom

至于依赖POM文件中声明的存储库,我认为不应该关心它们。如果您有一个依赖项,这需要在声明的存储库之一(设置、父 pom、pom)中可用,否则构建将失败(即使您之前已由另一个项目下载并缓存了该依赖项(子依赖项与否) )。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-16
    • 1970-01-01
    相关资源
    最近更新 更多