web-dev-qa-db-fra.com

Comment exclure toutes les occurrences d'une dépendance transitive lorsque j'utilise Gradle?

Mon projet de classe utilise le plug-in application pour créer un fichier jar. Dans le cadre des dépendances transitives à l'exécution, je finis par extraire org.slf4j:slf4j-log4j12. (Il est fait référence à une dépendance sous-transitive dans au moins 5 ou 6 autres dépendances transitives - ce projet utilise un ressort et un hadoop, de sorte que tout, à l'exception de l'évier de la cuisine, est rentré ... pas d'attente ... c'est là aussi :) ).

Je souhaite exclure globalement le fichier jar slf4j-log4j12 de mon fichier jar construit. Donc j'ai essayé ceci:

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

Cependant, cela semble exclure tousorg.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 à chercher la source de chaque dépendance slf4j-log4j12 transitive puis avoir des instructions individuelles compile foo { exclude slf4j... } dans mon bloc dependencies.

Mise à 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 spécifié group: "*".

Mise à jour 2:

J'utilise Gradle version 1.10 pour cela.

84
Jens D

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

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

Il semble qu’un règle d’exclusion ne possède que deux attributs - group et module. Cependant, la syntaxe ci-dessus ne vous empêche pas de spécifier une propriété arbitraire en tant que 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 un group: et name:, vous ne pouvez pas spécifier une exclusion avec un name:!?!

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

118
Jens D

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 propriétés groupe et module. Pour ceux d'entre vous qui viennent de l'arrière-plan maven, groupe est identique à groupId et module est identique à artifactId. Exemple: pour exclure com.mchange: c3p0: 0.9.2.1 devrait être un bloc d'exclusion

exclude group:"com.mchange", module:"c3p0"
33
venom.unleashed

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

27
Peter Niederwieser

dans l'exemple ci-dessous j'exclus

printemps-démarrage-démarreur-Tomcat

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

J'utilisais Spring Boot 1.5.10 et essayais d'exclure la journalisation, la solution donnée ci-dessus ne fonctionnait pas bien, j'utilise plutôt des configurations

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

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

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