Мы пользуемся менеджером репозиториев Artifactory.
Аналогичная проблема наблюдается и при использовании других репозиториев – таких как Nexus.
Содержание
Проблема
В одном из проектов обратили внимание, что в файле maven-metadata.xml
тег <latest>
не соответствует последней версии в теге <versions>
:
<?xml version="1.0" encoding="UTF-8"?> <metadata> <groupId>group-id</groupId> <artifactId>artifact-id</artifactId> <version>1.1-SNAPSHOT</version> <versioning> <latest>1.195-SNAPSHOT</latest> <versions> <version>1.1-SNAPSHOT</version> <version>1.2-SNAPSHOT</version> ... <version>1.202-SNAPSHOT</version> ...
Причины
Сам файл maven-metadata.xml
обновляется не репозиторием – а Maven-ом, который загружает его в конце билда из репозитория, обновляет с помощью maven-deploy-plugin
– и загружает обратно в репозиторий.
Тег <release>
в файле maven-metadata.xml
обновляется в двух случаях:
- если Maven 2 вызывается с параметром
-DupdateReleaseInfo=true;
- если Maven 3 деплоит артефакт не-snapshot версии.
Тег <latest>
предназначается исключительно для разрешения плагинов, и устанавливается только во время деплоя артефакта maven-plugin
, во 2-ой и 3-ей версиях Maven. Обновление этого тега происходит независимо от того – релизная или snapshot версия деплоится.
Отдельно хочется обратить внимание на параметр -DupdateReleaseInfo=true;
, который часто встречается в гугле как один из вариантов решения проблемы. Хотя в статье, в которой была найдена ссылка на решение, говорится о том, что это параметр затрагивает только тег <release>
– многие пишут, что его добавление помогало решить “проблему” с тегом <latest>
– однако в данном случае это не помогло.
В нашем случае с Artifactory решением стало использование REST API. Подробнее можно почитать тут>>>.
В Nexus, как упоминается в той же статье, имеется отдельная опция rebuild metadata.
Решение
Так как значение из тега <latest>
использовалось уже написанным кодом – то обошлись API-запросом после каждого билда, который выглядел так:
curl -u user:pass -v -X POST https://companyname.artifactoryonline.com/projectname/api/maven/calculateMetadata/repository-name/com/group-id/artifact-id/
Интересно, что я нигде в документации не увидел упоминания о том, что перед /api/maven/
надо указывать имя проекта, без которого запрос постоянно возвращал ошибку 404.
Ключевым полем в этом запросе является calculateMetadata
, подробнее о котором можно почитать тут>>>.