Avertissement SLF4J: le chemin de classe contient plusieurs liaisons SLF4J

1. Vue d'ensemble

Lorsque nous utilisons SLF4J dans nos applications, nous voyons parfois un message d'avertissement concernant plusieurs liaisons dans le chemin de classe imprimé sur la console.

Dans ce didacticiel, nous essaierons de comprendre pourquoi nous voyons ce message et comment le résoudre.

2. Comprendre l'avertissement

Tout d'abord, examinons un exemple d'avertissement:

SLF4J: Class path contains multiple SLF4J bindings. SLF4J: Found binding in [jar:file:.../slf4j-log4j12-1.7.21.jar!/org/slf4j/impl/StaticLoggerBinder.class] SLF4J: Found binding in [jar:file:.../logback-classic-1.1.7.jar!/org/slf4j/impl/StaticLoggerBinder.class] SLF4J: See //www.slf4j.org/codes.html#multiple_bindings for an explanation. SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory]

Cet avertissement nous indique que SLF4J a trouvé deux liaisons. L'un est dans slf4j-log4j12-1.7.21.jar et l'autre dans logback-classic-1.1.7.jar .

Maintenant, comprenons pourquoi nous voyons cet avertissement.

La façade de journalisation simple pour Java (SLF4J) sert de simple façade ou d'abstraction pour divers cadres de journalisation. Ainsi, cela nous permet de brancher notre cadre de journalisation souhaité au moment du déploiement.

Pour ce faire, SLF4J recherche des liaisons (aka fournisseurs) sur le chemin de classe. Les liaisons sont essentiellement des implémentations d'une classe SLF4J particulière destinée à être étendue pour se connecter à un cadre de journalisation spécifique.

De par sa conception, SLF4J ne se liera qu'avec un seul framework de journalisation à la fois. Par conséquent, si plus d'une liaison est présente sur le chemin de classe, il émettra un avertissement .

Il convient de noter que les composants intégrés tels que les bibliothèques ou les frameworks ne doivent jamais déclarer de dépendance à une liaison SLF4J. En effet, lorsqu'une bibliothèque déclare une dépendance à la compilation sur une liaison SLF4J, elle impose cette liaison à l'utilisateur final. De toute évidence, cela annule l'objectif de base de SLF4J. Par conséquent, ils ne devraient dépendre que de la bibliothèque slf4j-api .

Il est également important de noter que ce n'est qu'un avertissement. Si SLF4J trouve plusieurs liaisons, il choisira un cadre de journalisation dans la liste et se liera avec lui. Comme on peut le voir sur la dernière ligne de l'avertissement, SLF4J a choisi Log4j en utilisant org.slf4j.impl.Log4jLoggerFactory pour la liaison réelle.

3. Recherche des JAR en conflit

L'avertissement répertorie les emplacements de toutes les liaisons qu'il trouve. Habituellement, ces informations sont suffisantes pour identifier la dépendance sans scrupules qui entraîne de manière transitoire une liaison SLF4J indésirable dans notre projet.

S'il n'est pas possible d'identifier la dépendance à partir de l'avertissement, nous pouvons utiliser la dépendance: tree maven goal:

mvn dependency:tree

Cela affichera l'arborescence des dépendances pour le projet:

[INFO] +- org.docx4j:docx4j:jar:3.3.5:compile [INFO] | +- org.slf4j:slf4j-log4j12:jar:1.7.21:compile [INFO] | +- log4j:log4j:jar:1.2.17:compile [INFO] +- ch.qos.logback:logback-classic:jar:1.1.7:compile [INFO] +- ch.qos.logback:logback-core:jar:1.1.7:compile 

Nous utilisons Logback pour nous connecter à notre application. Par conséquent, nous avons délibérément ajouté la liaison Logback, présente dans le JAR classique de logback . Mais, la dépendance docx4j a également généré une autre liaison avec le JAR slf4j-log4j12 .

4. Résolution

Maintenant que nous connaissons la dépendance incriminée, tout ce que nous devons faire est d'exclure le JAR slf4j-log4j12 de la dépendance docx4j :

 org.docx4j docx4j ${docx4j.version}   org.slf4j slf4j-log4j12   log4j log4j   

Puisque nous n'allons pas utiliser Log4j, il pourrait être judicieux de l'exclure également.

5. Conclusion

Dans cet article, nous avons vu comment nous pouvons résoudre l'avertissement fréquemment rencontré concernant plusieurs liaisons émises par SLF4J.

Le code source qui accompagne cet article est disponible à l'adresse over sur GitHub.