Как исключить все случаи переходной зависимости при использовании Gradle?
Мой 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:
Я использую версию Grade 1.10 для этого.
8 ответов
Ах, следующее работает и делает то, что я хочу:
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
Таким образом, даже если вы можете указать зависимость с group:
а также name:
Вы не можете указать исключение с name:
!?!
Возможно, отдельный вопрос, но что же это за модуль тогда? Я могу понять понятие Maven для groupId: artifactId: version, которое, как я понимаю, переводится в group: name: version в Gradle. Но тогда, как я узнаю, к какому модулю (на языке грейдов) принадлежит конкретный артефакт Maven?
Для исключения одной или нескольких библиотек глобально добавьте в свой build.gradle следующее
configurations.all {
exclude group:"org.apache.geronimo.specs", module: "geronimo-servlet_2.5_spec"
exclude group:"ch.qos.logback", module:"logback-core"
}
Теперь у блока исключений есть два свойства: группа и модуль. Для тех из вас, кто пришел из maven background, group такой же, как groupId, а module такой же, как artifactId. Пример: для исключения com.mchange:c3p0:0.9.2.1 следует исключить блок
exclude group:"com.mchange", module:"c3p0"
Ваш подход правильный. (В зависимости от обстоятельств, вы можете использовать configurations.all { exclude ... }
.) Если эти исключения действительно исключают более одной зависимости (я никогда не замечал этого при их использовании), пожалуйста, сообщите об ошибке на http://forums.gradle.org/, в идеале с воспроизводимым примером.
В приведенном ниже примере я исключаю
весна-загрузка-стартер-кот
compile("org.springframework.boot:spring-boot-starter-web") {
//by both name and group
exclude group: 'org.springframework.boot', module: 'spring-boot-starter-tomcat'
}
Я использовал весеннюю загрузку 1.5.10 и пытается исключить logback, приведенное выше решение не работает, вместо этого я использую конфигурации
configurations.all {
exclude group: "org.springframework.boot", module:"spring-boot-starter-logging"
}
compile
устарела и была заменена на
implementation
. Поэтому решение для тех, кто использует более новые версии gradle:
implementation("org.springframework.boot:spring-boot-starter-web") {
exclude group: 'org.springframework.boot', module: 'spring-boot-starter-tomcat'
}
В дополнение к тому, что сказал @berguiga-mohamed-amine, я только что обнаружил, что подстановочный знак требует оставить аргумент модуля пустой строкой:
compile ("com.github.jsonld-java:jsonld-java:$jsonldJavaVersion") {
exclude group: 'org.apache.httpcomponents', module: ''
exclude group: 'org.slf4j', module: ''
}
Это для Kotlin DSL (build.gradle.kts), что предотвращает использование неправильных свойств.
Исключить библиотеку из всех конфигураций (,
runtimeOnly
, так далее.):
configurations.all {
exclude(group = "ir.mahozad.android", module = "pie-chart")
// OR exclude("ir.mahozad.android", "pie-chart")
}
// Another notation:
// configurations {
// all {
// exclude(group = "ir.mahozad.android", module = "pie-chart")
// }
// }
Исключите библиотеку из одной конфигурации (например,
implementation
):
configurations.implementation {
exclude(group = "ir.mahozad.android", module = "pie-chart")
}
// Another notation:
// configurations {
// implementation {
// exclude(group = "ir.mahozad.android", module = "pie-chart")
// }
// }
Исключите библиотеку для одной зависимости:
dependencies {
// ...
implementation("ir.mahozad.android:charts:1.2.3") {
exclude(group = "ir.mahozad.android", module = "pie-chart")
}
}