SLF4J: Class path contains multiple SLF4J bindings.错误解决

1.出现问题

错误如下:

SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/D:/Users/FFprincess/.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:/D:/Users/FFprincess/.m2/repository/org/slf4j/slf4j-log4j12/1.7.25/slf4j-log4j12-1.7.25.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]

说明这是maven问题,两者冲突

错误如下:

SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/usr/hbase/lib/slf4j-log4j12-1.6.4.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/usr/hadoop/share/hadoop/common/lib/slf4j-log4j12-1.7.5.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.

说明这是jar包冲突,分别为:

file:/usr/hbase/lib/slf4j-log4j12-1.6.4.jar!/org/slf4j/impl/StaticLoggerBinder.class
/usr/hadoop/share/hadoop/common/lib/slf4j-log4j12-1.7.5.jar!/org/slf4j/impl/StaticLoggerBinder.class

2. 错误原因

出现这种问题的根本原因是项目中确实存在了多个slf4j的绑定。这是毋庸置疑的。
但问题是,在我们项目中的几个模块里的pom文件都没有声明引用log4j,只声明了logback的引用,为什么slf4j还会找到两个绑定?
答案肯定是:既然你没有显式引用,那肯定是在哪个地方偷偷地引用了啊。你通过maven坐标引用的jar包里,肯定有冲突的jar包。

如下图所示。在我们的这个项目中,在core模块添加如下坐标。

<dependencies>
    <dependency>
        <groupId>com.github.wenweihu86.raft</groupId>
        <artifactId>raft-java-core</artifactId>
        <version>1.8.0</version>
    </dependency>
</dependencies>

这个坐标。它里面就含有了log4j的jar包,因为这个项目打包发布的时候,把slf4j的具体绑定一同打包了。

3.解决办法:

在上面的坐标里加上 <exclusions> 标签。该标签顾名思义就是排除一些东西。

<!--exclude log4j in raft-brpc-core-->
<exclusions>
     <exclusion>
         <groupId>org.apache.logging.log4j</groupId>
         <artifactId>log4j-slf4j-impl</artifactId>
     </exclusion>
     <exclusion>
         <groupId>org.apache.logging.log4j</groupId>
         <artifactId>log4j-core</artifactId>
     </exclusion>
 </exclusions>

 由上图可以看出,将需要排除的jar包的maven坐标放进去之后,maven会自动将这些jar包从当前项目移除。

 启动项目,控制台打印前后对比图:

前:

 后:

 

知识点延伸:

slf4j是日志门面,外观,抽象,接口。log4j,logback是具体实现。

 

 参考:

https://blog.csdn.net/weixin_42181264/article/details/112168270

https://blog.csdn.net/sinat_32336967/article/details/98531470

https://blog.csdn.net/sunzixiao/article/details/126256484



posted @ 2023-05-11 13:59  super超人  阅读(2064)  评论(0编辑  收藏  举报