Как исключить все случаи переходной зависимости при использовании 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")
    }
}
Другие вопросы по тегам