2016-12-08 5 views
0

В Maven POM Reference под Dependency version requirement specification главы, разница между мягкими и жестких требованием:Maven POM: мягкий против жесткой версии требования спецификации

1.0: "Soft" требованием на 1,0 (просто рекомендация, если она соответствует всем другим диапазонам для зависимости)
[1.0]: «Hard» требование на 1,0

Так что, если я пишу:

<version>1.0.0</version> 

Я выражающий мягкого требования, в то время как с:

<version>[1.0.0]</version> 

Я требую жестких один.

Хотя я понимаю, что все другие спецификации спецификаций объяснены (хорошо объяснено в вопросе this), я не могу получить эту разницу.

Я думаю, что жесткое требование означает: если нет версии 1.0.0, эта зависимость не может быть удовлетворена; но что такое мягкое? Означает ли это, что даже 1.0 или 1.0.0.1 подходят для этой зависимости? Или смысл совершенно другой?

Примечание: Я всегда использую спецификации мягкой зависимости, я спрашиваю, потому что мне интересно понять разницу, а не выбирать между использованием одного или другого.

ответ

2

Если вы заявляете зависимость от выполнения в своем проекте, Maven должен решить, какая версия должна использоваться. В идеале артефакт с объявленным номером версии доступен, и все.

Но часто вы зависите от нескольких зависимостей. И эти зависимости сами зависят от других зависимостей (это называется «transitive dependencies»). В этом случае может случиться, что зависимость (например, структура ведения журнала) запрашивается из разных библиотек в разных версиях. Maven должен «разрешать» зависимости в этом случае (чтобы не иметь одинаковых библиотек в разных версиях в пути к классам). Для этого Maven следует стратегии, и «рекомендуемые» версии могут быть отменены другими версиями из-за стратегии разрешения зависимостей (см. Пример here).

Но я думаю, что Maven будет отменять «мягкие» версии, а не «жесткие». Таким образом, если у вас есть две разные «жесткие» версии в дереве зависимостей, разрешение конфликтов будет невозможно, и buid завершится с ошибкой.

Из моего опыта я могу сказать вам, что «жесткие» номера версий очень редко используются (к настоящему моменту я не знаю никакого примера). Просто пойдите со специальной «мягкой» версией и не используйте диапазон версий (это сделает вашу сборку не воспроизводимой больше).


Кстати, вы можете найти совершенно аналогичное объяснение в Sonatype книге: Maven: The Complete Reference - Глава 3.4.3: Dependency Version Ranges

При объявлении "нормальной" версии таких как 3.8.2 для Junit, внутренне это представлено как «разрешить что угодно, но предпочитаю 3.8.2». Это означает, что при обнаружении конфликта Maven разрешает использовать алгоритмы конфликта для выбора наилучшей версии. Если вы укажете [3.8.2], оно будет означает, что будет использоваться только 3.8.2 и ничего больше. Если в другом месте есть зависимость, которая указывает [3.8.1], вы получите сообщение об ошибке , сообщающее вам о конфликте.

+0

вместо того, чтобы угадывать, не было бы довольно легко проверить, что происходит? – eis

+0

Я не ищу предложений о том, какой из них я должен использовать; Я отредактировал свои вопросы, спасибо за то, что сообщил мне об этом. – watery

+0

Забудьте мою рекомендацию - это был просто бонус ;-). Я думаю, что я объяснил остальное («мягкое» означает чрезмерное), и да - это должно быть легко проверить. – FrVaBe

Смежные вопросы