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