Версии maven выпускают кандидатов и моментальные снимки

Моя цель - выпустить проект с одной зависимостью. У меня есть репозиторий Nexus, в котором я развертываю как моментальные снимки, так и релизные версии.

У меня есть одна зависимость

group:artifact:1.1.0-SNAPSHOT

и следующий релиз-кандидат выпущен в моем репозитории Nexus

group:artifact:1.1.0-RC1

при запросе плагина версий для разрешения зависимостей он утверждает, что новых зависимостей нет. Так он считает, что

1.1.0-SNAPSHOT > 1.1.0-RC1

Однако, если в моем проекте у меня есть версия 1.0.0-SNAPSHOT, версия 1.1.0-RC1 разрешается как самая новая версия.

Что мне не хватает? (Я просмотрел исходники плагина, и у нас есть следующий фрагмент:

String otherQualifier = otherVersion.getQualifier();

if ( otherQualifier != null )
{
  if ( ( qualifier.length() > otherQualifier.length() )
      && qualifier.startsWith( otherQualifier ) )
  {
    // here, the longer one that otherwise match is considered older
    result = -1;
  }
  else if ( ( qualifier.length() < otherQualifier.length() )
      && otherQualifier.startsWith( qualifier ) )
  {
    // here, the longer one that otherwise match is considered older
    result = 1;
  }
  else
  {
    result = qualifier.compareTo( otherQualifier );
  }
}

что мне кажется глючным. Любая идея?


person mirlitone    schedule 14.03.2013    source источник


Ответы (3)


Номера версий Maven состоят из следующего:

<major version>.<minor version>.<incremental version>-<qualifier>

Если все номера версий равны, квалификатор сравнивается по алфавиту. "RC1" и "SNAPSHOT" отсортированы не иначе как "a" и "b". В результате «SNAPSHOT» считается более новым, поскольку он больше по алфавиту. См. эту страницу в качестве ссылка.

Обратите внимание, что a.b.c-RC1-SNAPSHOT будет считаться старше, чем a.b.c-RC1.

Я не уверен, что предложить в качестве решения - именно так работает управление версиями Maven.

person Duncan Jones    schedule 14.03.2013
comment
Это правильно только наполовину, так как SNAPSHOT — это специальный квалификатор, который обрабатывается maven вне описываемого вами процесса. См.: docs.oracle.com/middleware/1212/core/ МЭВЕН/ - person Angel O'Sphere; 09.05.2017
comment
Этот ответ мог быть правильным на момент написания, но способ, которым Maven сравнивает версии, был обновлен примерно с v3. Подробнее здесь stackoverflow.com/questions/13004443 / - person jmrah; 11.06.2020

Спецификации работают только с квалификатором major.minor.increment с квалифицированным сравнением по лексигографическому порядку, независимо от моментального снимка или чего-либо еще.

В итоге я разветвил maven-versions-plugin и реализовал свою собственную схему версий, которая считает, что моментальная версия кандидата на выпуск всегда старше, чем сам кандидат на выпуск.

Это было не так уж сложно реализовать, я расширил

org/codehaus/mojo/versions/ordering/MavenVersionComparator 

и объявленный собственным классом в

org/codehaus/mojo/versions/ordering/VersionComparators.java

и реализовал собственную бизнес-логику

person mirlitone    schedule 01.04.2014

По состоянию на https://docs.oracle.com/middleware/1212/core/MAVEN/maven_version.htm

Все версии с квалификатором старше, чем такая же версия без квалификатора (релизная версия).

Например:

1.2-бета-2 старше 1.2.

Идентичные версии с разными полями квалификатора сравниваются с помощью простого сравнения строк.

Например:

1.2-бета-2 новее, чем 1.2-альфа-6.

и

Maven обрабатывает квалификатор SNAPSHOT иначе, чем все остальные. Если за номером версии следует -SNAPSHOT, то Maven считает его еще не выпущенной версией связанной MajorVersion, MinorVersion или IncrementalVersion.

person Ceddaerrix    schedule 14.05.2021