Как Maven разрешает зависимости SNAPSHOT, когда в локальном и удаленном репозиториях есть SNAPSHOTS с разными временными метками?
Скажи у меня есть проект A
в разработке, которая зависит от проекта B
- который также в настоящее время находится в разработке и еще не выпущен.
Итак, в A
POM файл, у меня есть следующий раздел:
<dependency>
<groupId>com.example</groupId>
<artifactId>project-b</artifactId>
<version>1.0.0-SNAPSHOT</version>
<\dependency>
На работе у нас есть удаленное репо (Nexus) и окно CI (под управлением Jenkins).
Когда мой коллега вносит изменения в B
и передавая в SVN, Дженкинс выберет это изменение, скомпилирует и поместит в удаленное хранилище. Примерно в то же время я мог бы открыть B
локально внесите изменения, скомпилируйте и установите в мое локальное хранилище.
Как теперь решает Maven B
когда я пытаюсь mvn clean install
A
на местном уровне?
- Всегда ли он будет по умолчанию для моего локального SNAPSHOT, если найдет его?
- Всегда ли это будет по умолчанию для удаленного SNAPSHOT?
- Будет ли это смотреть на отметки времени?
- Будет ли это делать что-то другое?
На днях мы немного запутались, и в основном пришлось вручную удалить локальные репозитории, чтобы убедиться, что мы получили версию, которую ожидали получить. Поэтому я сейчас пытаюсь понять, что на самом деле произошло. (Поэтому, если у вас есть ссылки на места в документах, которые подробно описываются, это тоже будет высоко ценится...) Локально, у меня иногда есть несколько сборок SNAPSHOT в моей папке репозитория, одна без, а некоторые с чем-то выглядит как метка времени после SNAPSHOT
часть имени файла...
1 ответ
Артефакты, которые вы просто mvn install
не получай метку времени Отметка времени применяется, как только вы mvn deploy
в ваш внутренний / удаленный репозиторий. Если вы посмотрите в maven-metadata-local.xml
в вашем местном ~/.m2/repository/B/1.0.0-SNAPSHOT/
папка, в которой вы увидите строки:
<updated>YYYYMMDDHHMMSS</updated>
Вот как решатель зависимостей Maven решает, какой будет последний снимок.
Если случится так, что вы и ваш коллега развернете свой внутренний / удаленный репозиторий в течение одной и той же секунды, то это должен сделать менеджер репозитория - Nexus в вашем случае - для этого.
Обратите внимание: параграфы выше основаны на моем опыте работы с Maven, так как я не видел страницу документов, где это описано во всех деталях. Входные данные, где можно найти ссылку, а также дополнения и исправления, очень приветствуются.
См. Maven / Введение в репозитории для обзора.
Если вы хотите убедиться, что вы используете последние снимки:
объявлять
<updatePolicy>
в вашемsettings.xml
соответственно:- updatePolicy: этот элемент указывает, как часто должны происходить обновления. Maven будет сравнивать временную метку локального POM (хранящуюся в файле метаданных репозитория) с удаленным. Варианты выбора:
always
,daily
(дефолт),interval:X
(где X - целое число в минутах) илиnever.
- updatePolicy: этот элемент указывает, как часто должны происходить обновления. Maven будет сравнивать временную метку локального POM (хранящуюся в файле метаданных репозитория) с удаленным. Варианты выбора:
использовать
-U
|--update-snapshots
опция командной строки.$ mvn -h ... -U,--update-snapshots Forces a check for missing releases and updated snapshots on remote repositories ...
См. Также Maven: полный справочник, 6.1. Параметры командной строки Maven, 6.1.11. Загрузка и проверка зависимостей.
"Метка времени после части имени файла SNAPSHOT" необычна для меня. AFAIHS это либо один, либо другой только. Хотя это может произойти, если есть "-SNAPSHOT" в <artifactId>
в POM вашего проекта.
ОБНОВИТЬ
Смотрите также:
Репозиторий - SNAPSHOT Handling, который гласит:
Эта документация была нацелена на Maven 2.0 alpha 1. Она предназначена только для исторической справки и должна быть обновлена и интегрирована в документацию Maven.
но я не нашел какой-либо последней документации, где это было интегрировано.