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.
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?
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"
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.
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'
}
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"
}
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: ''
}