В Maven2, чтобы исключить одну транзитивную зависимость, я должен сделать что-то вроде этого:
<dependency>
<groupId>sample.group</groupId>
<artifactId>sample-artifactB</artifactId>
<version>1</version>
<exclusions>
<exclusion>
<groupId>sample.group</groupId>
<artifactId>sample-artifactAB</artifactId>
</exclusion>
</exclusions>
</dependency>
Проблема с этим подходом состоит в том, что я должен делать это для каждой транзитивной зависимости, вносимой sample-artifactB
.
Есть ли способ использовать какой-то подстановочный знак, чтобы исключить все транзитивные зависимости сразу, а не по одному?
maven-2
dependencies
pbreault
источник
источник
Ответы:
Для maven2 нет способа сделать то, что вы описываете. Для Maven 3 есть. Если вы используете Maven 3, пожалуйста, смотрите другой ответ на этот вопрос
Для maven 2 я бы порекомендовал создать свой собственный pom для зависимости с вашим <exclusion>. Для проектов, которым необходимо использовать эту зависимость, установите зависимость для своего пользовательского pom вместо типичного артефакта. Хотя это не обязательно позволяет исключать все транзитивные зависимости с помощью одного <exclusion>, оно позволяет вам написать свою зависимость только один раз, и все ваши проекты не должны поддерживать ненужные и длинные списки исключений.
источник
То, что сработало для меня (может быть, более новая функция Maven), это просто использование подстановочных знаков в элементе исключения.
У меня есть многомодульный проект, который содержит модуль «приложение», на который ссылаются в двух WAR-упакованных модулях. Один из этих WAR-упакованных модулей действительно нуждается только в классах домена (и я еще не отделил их от модуля приложения). Я нашел это, чтобы работать:
Подстановочный знак для groupId и artifactId исключает все зависимости, которые обычно распространяются на модуль с использованием этой зависимости.
источник
Одна вещь, которую я нашел полезным:
Если вы поместите зависимость с исключениями в раздел dependencyManagement родительского POM для вашего проекта или в импортируемое POM для управления зависимостями, вам не нужно повторять исключение (или версию).
Например, если ваш родительский POM имеет:
Тогда модули в вашем проекте могут просто объявить зависимость как:
В родительском POM будет указана версия и исключения. Я использую эту технику почти во всех наших проектах, и она исключает много повторений.
источник
Три года назад я рекомендовал использовать версию 99, которой не существует, но теперь я нашел лучший способ, тем более что версия 99 находится в автономном режиме:
В родительском POM вашего проекта используйте maven -forcer-plugin для сбоя сборки, если нежелательная зависимость проникает в сборку. Это можно сделать с помощью правила запрещенных зависимостей плагина :
Затем, когда это предупредит вас о нежелательной зависимости, исключите ее в разделе родительского POM
<dependencyManagement>
:Таким образом, нежелательная зависимость не будет отображаться случайно (в отличие от простой,
<exclusion>
которую легко забыть), она не будет доступна даже во время компиляции (в отличие отprovided
области действия), нет поддельных зависимостей (в отличие от версии 99) и она ' Будет работать без собственного репозитория (в отличие от версии 99). Этот подход будет работать даже на основе версии артефакта, классификаторов, области действия или целого идентификатора группы - подробности см. В документации .источник
<configuration>
игнорируется при выполнении цели из командной строки и должен быть перемещен прямо вверх<plugin>
.<dependencyManagement>
разделе. Запускmvn dependency:tree
в этом конкретном проекте не будет иметь исключенной зависимости вообще. Но все проекты, импортирующие эту зависимость, не будут учитывать<exclusions>
другой родительский объект - исключенный будет закрадываться !!! Я должен был перейти<exclusions>
к каждому модулю пом непосредственно.Я использую следующий обходной путь: вместо того, чтобы пытаться исключить артефакт во всех соответствующих зависимостях, я рисую зависимость как «предоставленную» на верхнем уровне. Например, чтобы избежать отправки xml-apis «любой версии»:
источник
В настоящее время нет способа исключить более одной транзитивной зависимости за раз, но для этого существует запрос функции на сайте Maven JIRA:
https://issues.apache.org/jira/browse/MNG-2315
источник
Для этого есть обходной путь: если вы установите область зависимости во время выполнения , транзитивные зависимости будут исключены. Хотя имейте в виду, это означает, что вам нужно добавить дополнительную обработку, если вы хотите упаковать зависимость времени выполнения.
Чтобы включить зависимость времени выполнения в любой пакет, вы можете использовать цель копирования плагина maven-dependency-plugin для определенного артефакта .
источник
<scope>provided</scope>
вместо этого<scope>runtime</scope>
.если вам нужно исключить все транзитивные зависимости из артефакта зависимости, который вы собираетесь включить в сборку, вы можете указать это в дескрипторе сборки-плагина:
источник
Если вы разрабатываете в Eclipse, вы можете в графе POM Editor (расширенные вкладки включены) найти зависимость, которую вы хотите исключить из своего проекта, а затем:
щелкните по нему правой кнопкой мыши -> «Исключить артефакт Maven ...», и Eclipse сделает исключение для вас без необходимости выяснять, с какой зависимостью связана библиотека.
источник
По какой причине вы исключаете все переходные зависимости?
Если есть конкретный артефакт (например, регистрация общего доступа), который необходимо исключить из каждой зависимости, может помочь подход Версии 99 не существует .
Обновление 2012: не используйте этот подход. Используйте maven -forcer-plugin и исключения . Версия 99 создает фиктивные зависимости, а хранилище Версии 99 находится в автономном режиме (есть похожие зеркала, но вы не можете полагаться на них, чтобы оставаться в сети всегда; лучше всего использовать только Maven Central).
источник
В симуляционной проблеме у меня была объявлена желаемая зависимость с предоставленной областью действия. При таком подходе транзитивные зависимости выбираются, но НЕ включаются в фазу пакета, что вам и нужно. Мне также нравится это решение с точки зрения обслуживания, потому что для обслуживания не требуется ни pom, ни пользовательского pom, как в решении whaley; вам нужно только указать конкретную зависимость в контейнере и все готово
источник
Используйте последний Maven в вашем classpath. Он удалит дубликаты артефактов и сохранит последний Maven артефакт.
источник