场景
依赖
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.13</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.36</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>1.2.11</version>
<type>jar</type>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.11</version>
<type>jar</type>
</dependency>
。。。
代码
public class ApiTest {
private final Logger logger = LoggerFactory.getLogger(ApiTest.class);
@Test
public void test(){
logger.info("Lasse到此一游");
}
}
不尽人意的结果:没有任何输出
网上找了一堆文章都无法解决,最后只能自己手撕源码了。
问题点
方法:org.slf4j.LoggerFactory.getILoggerFactory();
找错思路
可以看到我明明导入了logback-classic依赖,它却使用了slf4j-log4j12
又在网上搜索了找了一下有没有指定使用特定依赖包下的StaticLoggerBinder,结果无。
又想到是否根据依赖导入的顺序,当机立断去看哪个依赖导入了slf4j-log4j12
最后找到了是org.apache.zookeeper引用了slf4j-log4j12
解决方法
LoggerFactory是根据加载顺序指定使用哪个依赖下的StaticLoggerBinder的。
所以调整依赖的顺序。
将logback-classic顺序放到依赖的最上方
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.36</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>1.2.11</version>
<type>jar</type>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.11</version>
<type>jar</type>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.13</version>
</dependency>
结果查看
使用理想中的依赖
方法:org.slf4j.LoggerFactory.getILoggerFactory();
可以看到它用到了logback-classic下的StaticLoggerBinder类
控制台输出
总结
今后除了关注依赖冲突,版本冲突还有多加一项依赖的加载顺序。