2015-10-09 1 views
2

Если проект Maven транзитивно использует несколько версий библиотеки, посредничество зависимостей Maven будет проходить арбитраж по ближайшему определению и порядку в объявлении. (См. docs.)Почему посредничество Maven не выбирает самую новую версию?

E.g. если A -> B -> X - 1.0.0 и A -> B -> C -> X - 2.0.0, тогда построение A будет использовать X - 1.0.0.

Почему? Разумно предположить, что X-2.0.0 добавил некоторый метод, который используется C, поэтому запуск A, вероятно, приведет к исключению во время выполнения. Разве не имеет смысла выбирать новейшую версию? (Я знаю, что вы можете указать его вручную.)

ответ

1

Также разумно предположить, что версия 2.x имеет удален какой-либо метод, который используется A или B. Maven не может знать, что является правильным в этом и решает, что ближайшим определением является тай-брейк. Если разработчику не нравится этот выбор, он может добавить прямую зависимость, как вы заметили.

1

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

Стратегия посредничества по умолчанию Ivy является «новейшей», а не «ближайшей», и, похоже, она работает очень хорошо практически во всех случаях. См. http://ant.apache.org/ivy/history/2.2.0/settings/conflict-managers.html