1. 报错
SLF4J: Class path contains multiple SLF4J bindings
本文是log4j与logback冲突了。检查了所有的pom.xml文件。没有log4j的依赖。在启动的时候会报发现多个slf4j的绑定。项目实际用的是logback。为什么还是会去检查log4j???
该问题已解决。如下图所示。已经不报多个绑定的错误了。
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包从当前项目移除。