Ответ 1
Поправьте меня, если я ошибаюсь, но зеркало используется для перенаправления всего трафика на определенный URL-адрес хранилища и блокирования всего остального (включая центральное хранилище Maven).
Это не совсем правильно. Maven загружает артефакты путем поиска в определенных хранилищах. Эти репозитории определены в POM проекта или в настройках Maven. Но, как указано в документации к зеркалу:
Однако вы можете захотеть использовать альтернативное зеркало для определенного репозитория без изменения файлов проекта.
Давайте возьмем пример из документации и прокомментируем его:
<mirrors>
<mirror>
<id>UK</id>
<name>UK Central</name>
<url>http://uk.maven.org/maven2</url>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>
Это определяет одно зеркало, которое будет использоваться, когда Maven захочет получить зависимость из центрального репозитория Maven. Допустим, у вас есть 2 текущих репозитория, а именно Maven Central и пользовательский репозиторий A. Что происходит следующим образом:
- Вы объявляете зависимость от артефакта;
- Maven будет искать эту зависимость в ваших определенных репозиториях, поэтому он будет искать ее в репозитории A и Maven Central;
- Допустим, он начинается с A: он попадет на URL, определенный для этого репозитория, как и следовало ожидать. Тогда позвольте сказать, что это не было найдено там;
- Затем он заглянет внутрь Maven Central. Однако Maven заметит, что для этого хранилища было настроено зеркало. Это не ударит Maven Central в
repo1.maven.org
. Вместо этого онuk.maven.org
его изuk.maven.org
, который является URL-адресом, определенным в элементе конфигурации зеркала.
Как показывает этот пример, зеркало применяется только к определенным репозиториям, которые определены с помощью элемента конфигурации <mirrorOf>
. В предыдущем случае у нас было <mirrorOf>central</mirrorOf>
что означает "Mirror Maven Central". Этот элемент может иметь различные значения, и в документации приведены примеры:
Примеры:
*
= всеexternal:*
= все не на локальном хосте и не на основе файлов.repo,repo1
= репо или репо1*,!repo1
= все, кроме repo1:
А что если у меня есть зеркало для
http://a.com:8081
и хранилище дляhttp://b.com:8081
. Будет ли второй URL когда-нибудь привыкнуть? Я предполагаю, что ответ №
Вышесказанное показывает, что ответ не строго нет. Зеркало на http://a.com:8081
будет использовано, когда Maven попытается извлечь зависимость из одного из зеркалируемых репозиториев. Если он действительно отражает хранилище на http://b.com:8081
то запросы на http://b.com:8081
не будут http://b.com:8081
(они будут перенаправлены на http://a.com:8081
); но если этого не произойдет, Maven продолжит получать зависимости от http://b.com:8081
как обычно.
Можете ли вы иметь несколько зеркал?
Да, ты можешь.