Как настроить Maven для работы с локальными репозиториями компании при закрытом центральном репозитории?
Что проверяют
Знаете ли вы, где в Maven живут настройки репозиториев и как направить весь трафик через корпоративный менеджер артефактов вроде Nexus или Artifactory. Следом обычно спрашивают, как публиковать свои артефакты и где хранить пароли.
Как отвечать
Схема такая: в компании стоит менеджер репозиториев, в нём proxy-репозиторий, который кеширует Maven Central (если у сервера есть выход наружу), hosted-репозитории для своих релизов и снапшотов и group-репозиторий, объединяющий их под одним URL. Разработчики и CI ходят только в group.
settings.xml: пользовательский в~/.m2/settings.xml, глобальный в${maven.home}/conf/settings.xml. Сюда, а не вpom.xml, кладётся всё, что зависит от окружения;- *
<mirror>с `<mirrorOf></mirrorOf>**: перенаправляет все запросы, включая неявныйcentralиз super POM, на URL group-репозитория. Вариантexternal:*` не трогает локальные file-репозитории; <servers>: учётные данные, причём<id>сервера обязан совпадать с<id>зеркала. Пароли не хранят открытым текстом: в CI подставляют из переменных окружения через${env.NEXUS_TOKEN}, локально используют штатное шифрование Maven;distributionManagementвpom.xml: кудаmvn deployпубликует релизы и снапшоты;- плагины: они тоже скачиваются, и зеркало на
*закрывает их вместе с зависимостями.
Если у менеджера совсем нет интернета, сторонние артефакты заливают в hosted-репозиторий вручную: mvn deploy:deploy-file или загрузкой через веб-интерфейс. Флаг -o даёт оффлайновую сборку, но только по уже заполненному локальному кешу.
Проверить результат можно командой mvn help:effective-settings и логом сборки с -X: там видно, по какому URL идёт каждое скачивание.
Где спотыкаются
Прописывают репозитории в pom.xml каждого проекта. Адрес внутреннего сервера оказывается в коде, и при переезде правятся десятки репозиториев.
Кладут пароль открытым текстом в settings.xml и коммитят его вместе с проектом.
Путают локальный репозиторий ~/.m2/repository, то есть кеш на машине, с внутренним удалённым. Ещё частая ловушка: id в <servers> не совпадает с id зеркала, и Maven получает 401 без внятного объяснения.