Wie schließe ich bei Verwendung von Gradle alle Instanzen einer transitiven Abhängigkeit aus?

103

Mein Gradle-Projekt verwendet das applicationPlugin, um eine JAR-Datei zu erstellen. Als Teil der transitiven Laufzeitabhängigkeiten ziehe ich am Ende ein org.slf4j:slf4j-log4j12. (Es wird in mindestens 5 oder 6 anderen transitiven Abhängigkeiten als subtransitive Abhängigkeit bezeichnet - dieses Projekt verwendet Spring und Hadoop, also wird alles außer dem Spülbecken eingezogen ... keine Wartezeit ... das ist auch da :) ).

Ich möchte das slf4j-log4j12Glas global von meinem gebauten Glas ausschließen. Also habe ich das versucht:

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

Dies scheint jedoch alle org.slf4j Artefakte einschließlich auszuschließen slf4j-api. Wenn ich im Debug-Modus laufe, sehe ich Zeilen wie:

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).

Ich möchte nicht die Quelle jeder slf4j-log4j12transitiven Abhängigkeit nachschlagen müssen und dann einzelne compile foo { exclude slf4j... }Anweisungen in meinem dependenciesBlock haben.

Aktualisieren:

Ich habe auch folgendes versucht:

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

Was dazu führt, dass alles vom Build ausgeschlossen wird! Als ob ich angegeben hätte group: "*".

Update 2:

Ich verwende dafür Gradle Version 1.10.

Jens D.
quelle
2
Vielleicht möchten Sie Antworten auf Ihre Fragen akzeptieren. Es ist höflich und weckt mehr Interesse an der Beantwortung Ihrer Fragen
Michael Deardeuff

Antworten:

136

Ah, das Folgende funktioniert und macht was ich will:

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

Es scheint, dass eine Ausschlussregel nur zwei Attribute hat - groupund module. Die obige Syntax hindert Sie jedoch nicht daran, eine beliebige Eigenschaft als Prädikat anzugeben. Wenn Sie versuchen, eine einzelne Abhängigkeit auszuschließen, können Sie keine beliebigen Eigenschaften angeben. Dies schlägt beispielsweise fehl:

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

mit

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

Also, obwohl Sie eine Abhängigkeit mit a angeben können group:und name:Sie keinen Ausschluss mit a name:!?!

Vielleicht eine separate Frage, aber was genau ist dann ein Modul ? Ich kann den Maven-Begriff von groupId :ifactId: version verstehen, der meines Wissens in grouple: group: name: version in Gradle übersetzt wird. Aber woher weiß ich dann, zu welchem ​​Modul (in Gradle-Sprache) ein bestimmtes Maven-Artefakt gehört?

Jens D.
quelle
1
Dies scheint eine bessere Diskussion für die Gradle-Foren zu sein .
SuperEb
3
Ugh, ich hatte gerade mit genau diesem Problem zu kämpfen. Ich finde es so außerordentlich schwierig, etwas mit gradle zu tun, insbesondere Konflikte bei einem großen Projekt zu lösen. Ich würde gerne ausführliche XML mit xsd-Validierung über Gradles dsl
cjbooms
Der "Name:" sollte "Modul:" sein, dann funktioniert es für
dich
1
Zum Wohle der Zukunft wollte ich und andere ALLE Abhängigkeitsbibliotheken (Gradle 3.3) von meinem Kriegspaket ausschließen. Anstatt jeden einzelnen aufzulisten, habe ich es einfach getan configurations { runtime.exclude group: '*' }.
user1070304
39

Um eine oder mehrere Bibliotheken global auszuschließen, fügen Sie Ihrem build.gradle Folgendes hinzu

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

Nun schließt der Block hat zwei Eigenschaften Gruppe und Modul . Für diejenigen unter Ihnen, die aus dem Maven-Hintergrund stammen, ist group identisch mit groupId und module ist identisch mit artefaktId . Beispiel: Um com.mchange auszuschließen: c3p0: 0.9.2.1 sollte der folgende Ausschlussblock sein

exclude group:"com.mchange", module:"c3p0"
gift.unleashed
quelle
1
danke ich verstehe, sie hätten sagen können, Modul bedeutet Name
Remario
29

Ihr Ansatz ist richtig. (Abhängig von den Umständen möchten Sie möglicherweise verwenden configurations.all { exclude ... }.) Wenn diese Ausschlüsse wirklich mehr als eine einzelne Abhängigkeit ausschließen (das habe ich bei der Verwendung noch nie bemerkt), melden Sie bitte einen Fehler unter http://forums.gradle.org , idealerweise mit einem reproduzierbaren Beispiel.

Peter Niederwieser
quelle
1
configurations.all{}ist genau das, wonach ich gesucht habe. Danke für den Beitrag Peter
pczeus
19

im folgenden Beispiel schließe ich aus

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' 
}
BERGUIGA Mohamed Amine
quelle
5

Ich habe Spring Boot 1.5.10 verwendet und versucht, die Rückmeldung auszuschließen. Die oben angegebene Lösung hat nicht gut funktioniert. Stattdessen verwende ich Konfigurationen

configurations.all {
    exclude group: "org.springframework.boot", module:"spring-boot-starter-logging"
}
ortiz markieren
quelle
3

Zusätzlich zu dem, was @ berguiga-mohamed-amine angegeben hat, habe ich gerade festgestellt, dass für einen Platzhalter das Modulargument die leere Zeichenfolge belassen muss:

compile ("com.github.jsonld-java:jsonld-java:$jsonldJavaVersion") {
    exclude group: 'org.apache.httpcomponents', module: ''
    exclude group: 'org.slf4j', module: ''
}
Arnold Schrijver
quelle