Какой порядок репозитория учитывает Maven при попытке загрузки плагинов? - PullRequest
1 голос
/ 07 апреля 2020

Я не нахожу документацию , где Maven говорит, как он заказывает объявленные репозитории.

Рассмотрим следующие места, где можно настроить репозитории maven:

  • settings.xml под settings/profiles/profile/repositories
    • id: settings-repo1
    • id: settings-repo2
  • settings.xml под settings/mirrors
    • id: settings-mirror1
    • id: settings-mirror2
  • parent pom.xml под project/repositories
    • id: pom -parent-repo1
    • id: pom-parent-repo2
  • child pom.xml под project/repositories
    • id: pom-child-repo1
    • id: pom-child-repo2
  • зависимости child pom.xml использует также репозитории:
    • id: dependency-repo1
    • id: dependency-repo2

В каком порядке Maven будет пытаться загрузить зависимости из всех этих репозиториев?

* mvn dependency:list-repositories команда показывает мне очень неупорядоченный список, который трудно считаю, что это настоящий приоритетный порядок.

1 Ответ

0 голосов
/ 08 апреля 2020

Я сделал следующее, чтобы определить порядок, в котором Maven считает порядок хранилища:

  • Я обновил URL-адреса всех настроек хранилища / зеркала во всех файлах XML как недействительные 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

и когда настроены зеркала ARE:

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), в противном случае сборка не удастся (даже если у вас есть эта зависимость, загруженная и кэшированная ранее другим проектом (зависимая или нет) ).

...