Comment exclure toutes les instances d'une dépendance transitive lors de l'utilisation de Gradle?

105

Mon projet gradle utilise le applicationplugin pour créer un fichier jar. Dans le cadre des dépendances transitives d'exécution, je finis par m'installer org.slf4j:slf4j-log4j12. (Il est référencé comme une dépendance sous-transitive dans au moins 5 ou 6 autres dépendances transitives - ce projet utilise spring et hadoop, donc tout sauf l'évier de la cuisine est entraîné ... non attendez ... c'est là aussi :) ).

Je souhaite exclure globalement le slf4j-log4j12pot de mon pot créé. Alors j'ai essayé ceci:

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

Cependant, cela semble exclure tous les org.slf4j artefacts, y compris slf4j-api. Lors de l'exécution en mode débogage, je vois des lignes telles que:

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

Je ne veux pas avoir à rechercher la source de chaque slf4j-log4j12dépendance transitive et ensuite avoir des compile foo { exclude slf4j... }déclarations individuelles dans mon dependenciesbloc.

Mettre à jour:

J'ai aussi essayé ceci:

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

Ce qui finit par exclure tout de la construction! Comme si j'avais précisé group: "*".

Mise à jour 2:

J'utilise Gradle version 1.10 pour cela.

Jens D
la source
2
vous voudrez peut-être accepter des réponses à vos questions; il est poli et suscite plus d'intérêt pour répondre à vos questions
Michael Deardeuff

Réponses:

139

Ah, ce qui suit fonctionne et fait ce que je veux:

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

Il semble qu'une règle d'exclusion n'a que deux attributs - groupet module. Cependant, la syntaxe ci-dessus ne vous empêche pas de spécifier une propriété arbitraire comme prédicat. Lorsque vous essayez d'exclure d'une dépendance individuelle, vous ne pouvez pas spécifier de propriétés arbitraires. Par exemple, cela échoue:

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

avec

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

Ainsi, même si vous pouvez spécifier une dépendance avec a group:et que name:vous ne pouvez pas spécifier d'exclusion avec a name:!?!

Peut-être une question distincte, mais qu'est- ce qu'un module alors? Je peux comprendre la notion Maven de groupId: artifactId: version, ce que je comprends se traduit par group: name: version dans Gradle. Mais alors, comment savoir à quel module (en gradle-speak) appartient un artefact Maven particulier?

Jens D
la source
1
Cela semble être une meilleure discussion pour les forums Gradle .
superEb
3
Ugh, je viens de me débattre avec ce problème précis. Je trouve exceptionnellement difficile de faire quoi que ce soit avec gradle, en particulier de résoudre les conflits sur un grand projet. Je prendrais volontiers du XML verbeux avec la validation xsd sur le DSL de
Gradle
Le "nom:" devrait être "module:", alors cela fonctionnera pour u :)
GuyK
1
Pour le bénéfice du futur moi et d'autres, je voulais exclure TOUTES les bibliothèques de dépendances (Gradle 3.3) de mon paquet war. Donc, plutôt que de lister chacun d'eux, je l'ai simplement fait configurations { runtime.exclude group: '*' }.
user1070304
39

Pour exclure une ou plusieurs bibliothèques globalement, ajoutez ce qui suit à votre build.gradle

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

Maintenant, le bloc d'exclusion a deux groupes de propriétés et un module . Pour ceux d'entre vous qui viennent de maven background, group est identique à groupId et module est identique à artifactId . Exemple: pour exclure com.mchange: c3p0: 0.9.2.1 suivant doit être exclure le bloc

exclude group:"com.mchange", module:"c3p0"
venin.
la source
1
merci je comprends, ils auraient pu dire module signifie nom
Remario
29

Votre approche est correcte. (Selon les circonstances, vous voudrez peut-être utiliser configurations.all { exclude ... }.) Si ces exclusions excluent vraiment plus d'une seule dépendance (je ne l'ai jamais remarqué lors de leur utilisation), veuillez signaler un bogue sur http://forums.gradle.org , idéalement avec un exemple reproductible.

Peter Niederwieser
la source
1
configurations.all{}est exactement ce que je cherchais. Merci pour le message Peter
pczeus
21

dans l'exemple ci-dessous, j'exclus

ressort-démarrage-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
la source
5

J'utilisais spring boot 1.5.10 et essayais d'exclure le retour de session, la solution donnée ci-dessus ne fonctionnait pas bien, j'utilise des configurations à la place

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

En plus de ce que @ berguiga-mohamed-amine a déclaré, je viens de découvrir qu'un caractère générique nécessite de laisser l'argument du module dans la chaîne vide:

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