web-dev-qa-db-fra.com

Comment exclure plusieurs liaisons SLF4J à LOG4J

Je reçois l'erreur

SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/C:/Users/george/.gradle/caches/artifacts-26/filestore/org.Apache.logging.log4j/log4j-slf4j-impl/2.0-beta8/jar/15984318e95b9b0394e979e413a4a14f322401c1/log4j-slf4j-impl-2.0-beta8.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/C:/Users/george/.gradle/caches/artifacts-26/filestore/org.slf4j/slf4j-log4j12/1.5.0/jar/aad1074d37a63f19fafedd272dc7830f0f41a977/slf4j-log4j12-1.5.0.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.

Dans mon fichier build.gradle, j'ai la ligne suivante pour inclure le pot log4j-slf4j-impl-2.0-beta8.jar (que je veux lier à LOG4J2)

 compile 'org.Apache.logging.log4j:log4j-slf4j-impl:2.0-beta8' 

Dans un autre fichier build.gradle dans un projet dépendant, j'ai plusieurs lignes similaires à ce qui suit:

 compile 'dcm4che:dcm4che-core:2.0.23'

Maintenant, dcm4che inclut une dépendance à la version 1 de log4j (slf4j-log4j12) et cela est donc inclus dans le projet global.

Voici un extrait de l'arbre de dépendance Gradle:

|    +--- dcm4che:dcm4che-core:2.0.23
|    |    \--- org.slf4j:slf4j-log4j12:1.5.0
|    |         +--- org.slf4j:slf4j-api:1.5.0 -> 1.7.5
|    |         \--- log4j:log4j:1.2.13 -> 1.2.14

J'ai lu le lien suggéré dans l'avertissement mais je n'arrive pas à comprendre comment lier mon application à log4j2 en utilisant le pot que je veux. La documentation de Gradle sur la gestion des dépendances ne l'a pas vraiment clarifiée.

18
giorgio

La solution consiste à ajouter ce qui suit dans le build.gradle.

configurations.all {
    resolutionStrategy.eachDependency { DependencyResolveDetails details ->
        if (details.requested.name == 'log4j') {
            details.useTarget "org.slf4j:log4j-over-slf4j:1.7.5"
        }
}

Le résultat est que tout ce qui nécessite normalement log4j utilisera log4j-over-slf4j à la place.

J'ai également ajouté:

if (details.requested.name == 'commons-logging') {
    details.useTarget "org.slf4j:jcl-over-slf4j:1.7.5"
}

pour l'exhaustivité afin de couvrir l'exploitation forestière commune.

14
giorgio

Mettez ce code dans votre build.gradle fichier

configurations.all {
   exclude group: 'org.slf4j', module: 'slf4j-log4j12'
}
19
Quy Tang

Excluez la dépendance qui contient le fichier slf4j .jar que vous ne souhaitez pas utiliser. Pour gradle this peut aider à le faire.

mise à jour:

Malheureusement, je ne suis pas familier avec Gradle, mais à en juger par la documentation liée qch. comme

compile('dcm4che:dcm4che-core:2.0.23') {
   exclude group: 'org.slf4j'
}

peut fonctionner? Notez que la documentation mentionne une sorte de liste d'exclusion "configuration globale", ce qui peut être un meilleur moyen de le faire, mais je n'ai pas trouvé plus d'informations à ce sujet.

5
Pyranja