Почему сопоставление версий не работает в Maven? - PullRequest
6 голосов
/ 27 июля 2010

Это мой pom.xml (фрагмент):

...
<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-entitymanager</artifactId>
    <version>[3.0,)</version>
</dependency>
...

Вот что mvn говорит мне:

Couldn't find a version in [3.2.0.cr2, 3.2.0.ga, 3.3.1.ga] to match range [3.0,)

Почему?

Ответы [ 2 ]

10 голосов
/ 28 июля 2010

Старая схема именования X.Y.Z.ga, используемая Hibernate (см. на этой странице для новых соглашений JBoss), не соответствует формату Maven и может плохо работать с алгоритмом сравнения версий. Цитирование правил номера версии :

Текущая реализация DefaultArtifactVersion в ядре Maven ожидает, что номера версий будут иметь очень специфический формат:

<MajorVersion [> . <MinorVersion [> . <IncrementalVersion ] ] [> - <BuildNumber | Qualifier ]>

Где MajorVersion, MinorVersion, IncrementalVersion и BuildNumber - все числовые, а Qualifier - строка. Если номер вашей версии не соответствует этому формату, тогда весь номер версии считается классификатором .

Если номера ваших версий не соответствуют этой схеме, у вас могут возникнуть проблемы с

  • диапазонов версий (к сожалению, плагин version-maven-ничто не может помочь вам решить ваши проблемы с диапазонами версий и схемой нумерации версий ... ну, вы можете заменить диапазоны версий свойствами и использовать update- свойства цели)
  • целей в этом плагине, которые сортируют версии, например, update-properties (вы можете сделать что-то, чтобы помочь с такими проблемами)

Алгоритм подробно описан в Посредничество зависимостей и разрешение конфликтов :

Определение сравнения версии по умолчанию

Спецификация по умолчанию должна быть составлена ​​следующим образом:

<major>.<minor>.<revision>([ -<qualififer> ] | [ -<build> ])

где:

  • раздел квалификатора является необязательным (и это SNAPSHOT, alpha-1, alpha-2)
  • секция сборки является необязательной (и увеличивает ее, начиная с 1, если указано)
  • любые элементы сборки или ревизии '0' могут быть опущены.
  • может быть дан только один из сборки и квалификатора (обратите внимание, что квалификатор с меткой времени включает номер сборки, но это не одно и то же)
  • номер сборки предназначен для тех, кто переупаковывает исходный артефакт (например, как это часто делается с rpms)

Для упорядочения выполняется следующее по порядку, пока не будет найден элемент, который не равен:

  • численное сравнение основной версии
  • численное сравнение минорной версии
  • если редакция не существует, добавьте ".0" для сравнения
  • числовое сравнение ревизии
  • если классификатор не существует, он новее, чем если бы
  • сравнение строк без учета регистра
    • это гарантирует, что метки времени будут упорядочены правильно, а SNAPSHOT новее, чем эквивалентные метки времени
    • это также гарантирует, что бета-версия идет после альфы, как и rc
  • если квалификатора нет и сборка не существует, для сравнения добавьте "-0"
  • численное сравнение сборки

Обратите внимание также на предлагаемое расширение от пользователя в среде rpm: Расширение зависимостей Maven 2.0

Подводя итог:

  • 3.2.0.cr2, 3.2.0.ga, 3.3.1.ga рассматриваются как квалификатор (то есть они каким-то образом становятся 0.0.0-3.2.0.cr2 и т. Д.)
  • Зная это, вы можете обмануть Maven, используя диапазон [0.0.0-3.0,).
  • Но это будет соответствовать большему количеству версий, чем хотелось бы (например, 2.x), поэтому остерегайтесь неожиданных побочных эффектов.

На самом деле, я рекомендую вообще не использовать диапазоны версий, они просто плохи для воспроизводимых сборок.

См. Также

0 голосов
/ 27 июля 2010

Добавить репозиторий в ваш pom.xml

Пример:

<repositories>
    <repository>
        <id>repo1</id>
        <name>repo1</name>
        <url>http://repo1.maven.org</url>
    </repository>
</repositories>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...