解决SLF4J警告信息Class path contains multiple SLF4J bindings,logback与log4j包冲突

运行日志中出现SLF4J警告信息Class path contains multiple SLF4J bindings,例如在SpringBoot中引用了sdk.renfei.net以后就会出现,其实这个是一个Jar包冲突的情况,只需要排除冲突的Jar包即可。

报错信息如下:

SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/Users/neil/.m2/repository/ch/qos/logback/logback-classic/1.2.3/logback-classic-1.2.3.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/Users/neil/.m2/repository/org/slf4j/slf4j-log4j12/1.7.30/slf4j-log4j12-1.7.30.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [ch.qos.logback.classic.util.ContextSelectorStaticBinder]
Class path contains multiple SLF4J bindings

原因分析

报错信息意思是说logback-classic 包和slf4j-log4j12 包,关于org/slf4j/impl/StaticLoggerBinder.class 这个类发生了冲突。发生这个错误的原因,首先logback日志的开发者和log4j的开发者据说是一波人,而SpringBoot新版默认日志插件是logback,而且很多的第三方工具都含有log4j的引入。例如sdk.renfei.net就使用了log4j日志插件,所以,基本上SpringBoot项目,如果不注意,肯定会出现这种冲突。

其中隐患

虽然可能并不影响项目启动,但是在打成Jar包以后,在线上可能会出现启动报错的情况,所以我们尽量把这个问题解决,避免启动失败的隐患。

问题解决

解决的办法也很简单,只需要排除冲突的Jar包即可,如果你用的是logback日志,一定要排除slf4j-log4j12包,不要排除logback-classic包,因为我决定主要使用logback,所以要排除掉log4j的slf4j-log4j12包,找到谁在依赖slf4j-log4j12包,然后排除它,在引用这个依赖的pom文件中dependency节点增加exclusions进行排除:

<dependency>
    <groupId>net.renfei</groupId>
    <artifactId>sdk</artifactId>
    <version>${renfeisdk.version}</version>
    <exclusions>
        <!--排除slf4j-log4j12-->
        <exclusion>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
        </exclusion>
    </exclusions>
</dependency>

先找到Maven管理菜单,点击“Show Dependenceies”

Show Dependenceies

然后会得到一个依赖图,我们找到冲突的包,就可以知道这个包是谁引入进来的,从而去排除

Maven依赖图Maven依赖结构

分享此页面

Comments