1. Обзор
В этом руководстве мы узнаем, как принудительно обновить локальный репозиторий Maven , если он поврежден. Для этого мы воспользуемся простым примером, чтобы понять, почему репозиторий может быть поврежден и как это исправить.
2. Предпосылки
Чтобы изучить и запустить команды из этого руководства, нам нужно использовать проект Spring Initializr и установить JDK и Maven.
3. Структура репозитория Maven
Maven сохраняет все зависимости проектов в папке .m2
. Например, на следующем изображении мы можем наблюдать структуру репозиториев Maven :
Как мы видим, Maven загружает все зависимости в папку репозитория .
Поэтому загрузка в наш локальный репозиторий необходима для доступа ко всему необходимому коду во время выполнения.
4. Загрузка зависимостей
Мы знаем, что Maven работает на основе конфигураций файла pom.xml .
Когда Maven выполнит этот файл pom.xml
, зависимости будут загружены из центрального репозитория Maven и помещены в ваш локальный репозиторий Maven . Если у нас уже есть зависимости в нашем локальном репозитории, Maven не будет их загружать.
Загрузка происходит, когда мы выполняем следующие команды:
mvn package
mvn install
Оба вышеперечисленных включают выполнение следующей команды:
mvn dependency:resolve
Следовательно, мы можем разрешить зависимости без использования пакета или установки, просто выполнив команду dependency:resolve
.
5. Поврежденные зависимости
При загрузке зависимостей может произойти сбой сети, что приведет к повреждению зависимостей. Прерванная загрузка зависимостей является основной причиной повреждения. Maven отобразит соответствующее сообщение:
Could not resolve dependencies for project ...
Давайте посмотрим, как мы можем решить эту проблему.
6. Автоматическое исправление поврежденных зависимостей
Maven обычно отображает поврежденную зависимость, когда уведомляет о сбое сборки:
Could not transfer artifact [artifact-name-here] ...
Чтобы исправить это, у нас могут быть автоматические или ручные подходы. Кроме того, мы должны запускать любое обновление репозитория в режиме отладки, добавляя опцию -X после
-U
, чтобы иметь лучшее представление о том, что происходит во время обновления.
6.1. Принудительно обновить все зависимости SNAPSHOT
Как мы уже знаем, Maven больше не будет загружать существующие зависимости. Поэтому, чтобы заставить Maven обновить все поврежденные зависимости SNAPSHOT, мы должны добавить в нашу команду параметр -U/–update-snapshots
:
mvn package -U
mvn install -U
Тем не менее, мы должны помнить, что эта опция не загружает повторно зависимость SNAPSHOT, если Maven уже загрузил ее и если контрольная сумма та же.
Это также упакует или установит наш проект следующим. Наконец, мы узнаем, как обновить репозиторий, не включая текущий рабочий проект.
6.2. Цель разрешения зависимостей
Мы можем сказать Maven разрешить наши зависимости и обновить моментальные снимки без каких-либо пакетов или команд установки. Для этой цели мы будем использовать цель dependency:resolve
, включив параметр -U
:
mvn dependency:resolve -U
6.3. Цель очистить локальный репозиторий
Мы знаем, что -U
просто повторно загружает поврежденные зависимости SNAPSHOT. В результате, в случае поврежденных зависимостей локального релиза, нам могут понадобиться более глубокие команды. Для этой цели мы должны использовать:
mvn dependency:purge-local-repository
Назначение dependency:purge-local-repository
— очистить (удалить и, при необходимости, повторно разрешить) артефакты из локального репозитория Maven. По умолчанию артефакты будут повторно разрешены.
6.4. Параметры очистки локального репозитория
Локальный репозиторий очистки можно настроить для запуска только для определенной группы зависимостей, указав « groupId»
для параметра разрешения
Fuzziness и точный идентификатор группы для поиска с использованием параметра включения
:
mvn dependency:purge-local-repository -Dinclude:org.slf4j -DresolutionFuzziness=groupId -Dverbose
Параметр разрешения
Fuzziness
может принимать значения: версия
, артефакт
, идентификатор группы , файл
.
В приведенном выше примере выполняется поиск и удаление всех артефактов в группе org.slf4j
. Мы также установили подробный
параметр, чтобы мы могли видеть подробные журналы удаленных артефактов.
Если будут найдены какие-либо файлы, соответствующие условию, в журнале будет отображаться текст, например:
Deleting 2 transitive dependencies for project [...] with artifact groupId resolution fuzziness
[INFO] Purging artifact: org.slf4j:jul-to-slf4j:jar:1.7.31
Purging artifact: org.slf4j:slf4j-api:jar:1.7.31
Обратите внимание, что для указания артефактов, включенных или исключенных для удаления или обновления, мы можем использовать параметры include/exclude:
mvn dependency:purge-local-repository -Dinclude=com.yyy.projectA:projectB -Dexclude=com.yyy.projectA:projectC
7. Удаление репозитория вручную
В то время как параметр -U
и purge-local-repository
могут устранить поврежденные зависимости без их обновления, ручное удаление файла . Локальный репозиторий m2
вызовет принудительную повторную загрузку всех зависимостей.
Это может быть полезно при наличии старых и, возможно, поврежденных зависимостей. Тогда простая переупаковка или повторная установка должны помочь. Более того, мы можем использовать параметр dependency:resolve
для решения зависимостей исключительно нашего проекта.
8. Заключение
В этом руководстве мы обсудили параметры и цели Maven, который принудительно обновляет наш локальный репозиторий.
Используемые примеры представляют собой простые команды Maven, которые можно использовать в любом проекте с правильно настроенным файлом pom.xml
.