Подтвердить что ты не робот

Как Maven разрешает конфликты версий транзитивных зависимостей? стратегия ближайших побед

Я только что привык к тому, что в моих проектах не было задействованных необъявленных или неиспользуемых объявленных зависимостей. Хотя очень сложно отслеживать неиспользуемые объявленные зависимости времени выполнения/тестирования, которые перечислены в зависимости: анализировать... Просто нужно писать комментарии к ним в pom.xml или иным образом управлять им, чтобы знать, что они необходимы для тестирования или времени выполнения.

Но путь разрешения конфликта версий до сих пор не ясен. Что касается транзитивных зависимостей.

Как работает стратегия ближайших побед? Когда одна версия используется над другой версией?

  • Если вы объявляете использованную необъявленную зависимость с номером версии, она всегда выигрывает

  • Если вы не укажете версию зависимостей явно, Maven не может разрешить любую версию конфликты, которые могут возникнуть в отношении этой зависимости (странно, но написано здесь)

  • Если вы не объявляете Undeclared используемую зависимость, она выбирает транзитивную зависимость от ближайшего уровня (стратегия ближайших побед), и если конфликт находится на одном уровне, то он каким-то образом решает между версией A над версией B... Может быть, первый из них возникает при обработке зависаний

4b9b3361

Ответ 1

Я думаю, что разрешение зависимости работает точно так же, как вы описали.

Я также думаю, что ваша жизнь будет намного проще, если вы используете тег <scope> для детей на свой <dependency>

как указано на официальном сайте maven:

  • компиляции: Это область по умолчанию, которая используется, если ни один не указан. Зависимости компиляции доступны во всех классах проекта. Кроме того, эти зависимости распространяются на зависимые проекты.
  • при условии: это очень похоже на компиляцию, но указывает, что вы ожидаете, что JDK или контейнер предоставят зависимость во время выполнения. Например, при создании веб-приложения для Java Enterprise Edition вы должны установить зависимость от API-интерфейса Servlet и связанных с ним API-интерфейсов Java EE для области видимости, поскольку веб-контейнер предоставляет эти классы. Эта область видимости доступна только в пути к компиляции и тестированию и не является транзитивной.
  • runtime Эта область указывает, что зависимость не требуется для компиляции, но предназначена для выполнения. Он находится в среде выполнения и тестирует пути к классам, но не компилирует путь к классам.
  • test: эта область указывает, что зависимость не требуется для нормального использования приложения и доступна только для фаз компиляции и выполнения тестов.
  • : эта сфера аналогична предоставленной, за исключением того, что вы должны предоставить JAR, который содержит это явно. Артефакт всегда доступен и не просматривается в репозитории.
  • import: (доступно только в Maven 2.0.9 или новее) Эта область применения используется только в зависимости от типа pom в этом разделе. Он указывает, что указанный POM должен быть заменен зависимостями в этом разделе POM. Поскольку они заменяются, зависимости с областью импорта фактически не участвуют в ограничении транзитивности зависимости.

Ответ 2

Есть некоторые ссылки на документацию по управлению зависимостями:

http://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html (импортировать таблицу в разделе "область зависимости" )

В немецком журнале есть статья о богах, описывающая решение зависимостей - вот ссылка на статью bibtex: http://www.bibsonomy.org/bibtex/2ef10bb1bc1be7806bc3fba53417bbd5f/funthomas424242

В плагине сонаты есть раздел о плагине зависимостей: http://www.sonatype.com/books/mvnex-book/reference/optimizing-sect-dependency-plugin.html

Надеюсь, это было полезно.