Maven尝试下载插件时会考虑哪些存储库顺序?

时间:2020-04-07 20:38:20

标签: maven repository maven-dependency

我找不到documentation,Maven在这里说过如何订购已声明的存储库。

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

  • settings.xmlsettings/profiles/profile/repositories
    • id:settings-repo1
    • id:settings-repo2
  • settings.xmlsettings/mirrors
    • id:settings-mirror1
    • id:settings-mirror2
  • pom.xml下的
  • 父级project/repositories
    • id:pom-parent-repo1
    • id:pom-parent-repo2
  • pom.xml下的
  • project/repositories
    • id:pom-child-repo1
    • id:pom-child-repo2
  • pom.xml的依赖项还使用存储库:
    • id:dependency-repo1
    • id:dependency-repo2

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

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

1 个答案:

答案 0 :(得分: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)中使用此依赖项,否则构建将失败(即使您先前已将另一个项目下载并缓存了该依赖项(无论是否具有子依赖项) )。