Maven: не обновляется тег latest в файле maven-metadata.xml

Автор: | 11/28/2015
 

apache_maven_logoМы пользуемся менеджером репозиториев 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 обновляется в двух случаях:

  1. если Maven 2 вызывается с параметром -DupdateReleaseInfo=true;
  2. если 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, подробнее о котором можно почитать тут>>>.