Что происходит при потере сети во время загрузки артефактов Maven
Что проверяют
Разбираетесь ли вы в том, откуда берутся зависимости, и чините ли сборку осмысленно. Вопрос бытовой, но отделяет тех, кто видел, как сборка после обрыва сети не чинится сама даже при вернувшемся интернете, от тех, кто в такой ситуации сносит всё подряд.
Как отвечать
Опишите механику. Артефакт скачивается из удалённого репозитория в локальный каталог ~/.m2/repository и дальше берётся оттуда. Если связь пропала:
- уже скачанные зависимости не мешают, сборка идёт как обычно, сеть нужна только за недостающим;
- недостающий артефакт даёт ошибку разрешения зависимости, и сборка останавливается на этом модуле;
- рядом с артефактом остаётся файл с суффиксом
.lastUpdated, куда записана неудача. Из-за него следующая попытка может вообще не пойти в сеть: в логе будет сказано, что отказ закэширован и попытка не повторится до истечения интервала обновления.
Отсюда лечение: mvn -U форсирует обращение к репозиторию, удаление каталога проблемного артефакта или файлов .lastUpdated снимает залипший отказ, флаг -o собирает офлайн на том, что уже есть, а dependency:go-offline прогревает кэш заранее.
Хорошо добавить инфраструктурный слой: репозиторий-прокси внутри сети снимает зависимость от внешних узлов, а в CI локальный репозиторий кэшируют между запусками.
Где спотыкаются
Удаляют весь ~/.m2/repository при первой ошибке. Это часы повторной загрузки из-за одного артефакта, а заодно потеря того, что вообще нигде больше не лежит. Чистить нужно точечно, по пути группы и версии.
Второе: не учитывают, что оборванная загрузка оставляет битый файл. Проверка контрольной суммы по умолчанию только предупреждает, поэтому повреждённый архив спокойно живёт в кэше, а компиляция падает на невнятной ошибке чтения архива вместо честного сообщения про сеть.
Третье: считают офлайн-режим универсальным спасением. Он собирает только на том, что уже лежит локально, а новая зависимость, свежая версия плагина или снимок с истёкшим интервалом обновления без сети не приедут. Воспроизводимость начинается с зафиксированных версий плагинов, а не с флага.