Як виключити всі випадки транзитивної залежності при використанні Gradle?


104

Мій проект 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
ви можете прийняти відповіді на свої запитання; це ввічливо і збирає більший інтерес відповідати на ваші запитання
Майкл Дірдеуфф

Відповіді:


138

А, наступне працює і робить те, що я хочу:

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:!?!

Може бути , це окреме питання, але що саме це модуль тоді? Я можу зрозуміти поняття Maven про groupId: artifactId: version, яке, як я розумію, перекладається на group: name: version у Gradle. Але тоді, як я можу дізнатись, до якого модуля (у градації) належить певний артефакт Maven?


1
Це здається кращою дискусією для форумів Gradle .
superEb

Так зроблено - forums.gradle.org/gradle/topics/…
Єнс Д

3
Тьфу, я просто боровся з цією точною проблемою. Мені так надзвичайно важко щось робити із gradle, особливо вирішувати конфлікти у великому проекті. Я б із задоволенням взяв багатослівний xml з підтвердженням xsd над dsl
gradle

"Name:" повинен бути "module:", тоді він буде працювати для u :)
GuyK

1
На користь майбутніх мене та інших, я хотів виключити ВСІ бібліотеки залежностей (Gradle 3.3) зі свого пакету війни. Тому, замість того, щоб перерахувати кожного, я просто зробив це configurations { runtime.exclude group: '*' }.
user1070304 02.03.17

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"
}

Тепер блок виключення має дві властивості: групу та модуль . Для тих, хто походить з maven background, група така сама, як 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{}саме те, що я шукав. Дякую за пост Петро
pczeus

20

у прикладі нижче я виключаю

spring-boot-starter-tomcat

compile("org.springframework.boot:spring-boot-starter-web") {
     //by both name and group
     exclude group: 'org.springframework.boot', module: 'spring-boot-starter-tomcat' 
}

5

Я використовував весняну завантажувальну версію 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: ''
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.