Как мне исключить все экземпляры транзитивной зависимости при использовании Gradle?

105

Мой проект Gradle использует applicationплагин для создания файла jar. Как часть транзитивных зависимостей времени выполнения, я в конечном итоге подключаюсь org.slf4j:slf4j-log4j12. (Он упоминается как субтранзитивная зависимость по крайней мере в 5 или 6 других транзитивных зависимостях - этот проект использует spring и hadoop, поэтому все, кроме кухонной мойки, втягивается ... нет, подождите ... это тоже есть :) ).

Я хочу глобально исключить slf4j-log4j12банку из созданной мной банки. Итак, я пробовал это:

configurations {
  runtime.exclude group: "org.slf4j", name: "slf4j-log4j12"
}

Однако это, похоже, исключает все org.slf4j артефакты, включая slf4j-api. При работе в режиме отладки я вижу такие строки, как:

org.slf4j#slf4j-api is excluded from com.pivotal.gfxd:gfxd-demo-mapreduce:1.0(runtime).
org.slf4j#slf4j-simple is excluded from com.pivotal.gfxd:gfxd-demo-mapreduce:1.0(runtime).
org.slf4j#slf4j-log4j12 is excluded from org.apache.hadoop:hadoop-common:2.2.0(runtime).

Я не хочу искать источник каждой slf4j-log4j12транзитивной зависимости, а затем иметь отдельные compile foo { exclude slf4j... }операторы в моем dependenciesблоке.

Обновить:

Я тоже пробовал это:

configurations {
  runtime.exclude name: "slf4j-log4j12"
}

Что в конечном итоге исключает все из сборки! Как бы я ни уточнил group: "*".

Обновление 2:

Для этого я использую Gradle версии 1.10.

Йенс Д
источник
2
вы можете принять ответы на свои вопросы; это вежливо и вызывает больший интерес, отвечая на ваши вопросы,
Майкл Дирдефф,

Ответы:

140

Ах, следующее работает и делает то, что я хочу:

configurations {
  runtime.exclude group: "org.slf4j", module: "slf4j-log4j12"
}

Кажется, что правило исключения имеет только два атрибута - groupи module. Однако приведенный выше синтаксис не мешает вам указать любое произвольное свойство в качестве предиката. При попытке исключить из отдельной зависимости вы не можете указать произвольные свойства. Например, это не удается:

dependencies {
  compile ('org.springframework.data:spring-data-hadoop-core:2.0.0.M4-hadoop22') {
    exclude group: "org.slf4j", name: "slf4j-log4j12"
  }
}

с участием

No such property: name for class: org.gradle.api.internal.artifacts.DefaultExcludeRule

Таким образом, даже если вы можете указать зависимость с помощью a group:и name:не можете указать исключение с помощью name:!?!

Возможно, отдельный вопрос, а что же тогда такое модуль ? Я могу понять понятие GroupId: artifactId: version в Maven, которое, как я понимаю, переводится как group: name: version в Gradle. Но тогда как мне узнать, к какому модулю (на языке Gradle) принадлежит конкретный артефакт Maven?

Йенс Д
источник
1
Это похоже на лучшее обсуждение для форумов Gradle .
superEb
Готово
Jens D
4
Ух, я просто боролся именно с этой проблемой. Я считаю, что делать что-либо с gradle чрезвычайно сложно, особенно разрешать конфликты в большом проекте. Я с радостью возьму подробный xml с проверкой xsd поверх dsl от
gradle
"
Name
1
Ради будущего меня и других я хотел исключить ВСЕ библиотеки зависимостей (Gradle 3.3) из моего военного пакета. Так что вместо того, чтобы перечислять каждого, я просто сделал configurations { runtime.exclude group: '*' }.
user1070304 02
39

Для глобального исключения одной или нескольких библиотек добавьте в build.gradle следующее:

configurations.all {
   exclude group:"org.apache.geronimo.specs", module: "geronimo-servlet_2.5_spec"
   exclude group:"ch.qos.logback", module:"logback-core"
}

Теперь у блока exclude есть две группы свойств и модуль . Для тех из вас, кто работает с maven, группа такая же, как groupId, а модуль такой же, как artifactId . Пример: Чтобы исключить com.mchange: c3p0: 0.9.2.1, следует исключить блок

exclude group:"com.mchange", module:"c3p0"
яд. развязанный
источник
1
спасибо, я понимаю, они могли бы сказать, что модуль означает имя
Ремарио
29

Ваш подход правильный. (В зависимости от обстоятельств вы можете захотеть использовать configurations.all { exclude ... }.) Если эти исключения действительно исключают более одной зависимости (я никогда не замечал этого при их использовании), сообщите об ошибке на http://forums.gradle.org , в идеале с воспроизводимым примером.

Питер Нидервизер
источник
1
configurations.all{}это именно то, что я искал. Спасибо за сообщение Peter
pczeus
21

в примере ниже я исключаю

весенняя загрузка-стартер-кот

compile("org.springframework.boot:spring-boot-starter-web") {
     //by both name and group
     exclude group: 'org.springframework.boot', module: 'spring-boot-starter-tomcat' 
}
БЕРГУИГА Мохамед Амин
источник
5

Я использовал spring boot 1.5.10 и пытался исключить логбэк, данное решение выше не сработало, вместо этого я использую конфигурации

configurations.all {
    exclude group: "org.springframework.boot", module:"spring-boot-starter-logging"
}
Марк Ортис
источник
3

В дополнение к тому, что заявил @ berguiga-mohamed-amine, я только что обнаружил, что подстановочный знак требует, чтобы аргумент модуля оставался пустой строкой:

compile ("com.github.jsonld-java:jsonld-java:$jsonldJavaVersion") {
    exclude group: 'org.apache.httpcomponents', module: ''
    exclude group: 'org.slf4j', module: ''
}
Арнольд Шрайвер
источник