本文已参与「新人创作礼」活动,一起开启掘金创作之路。
使用场景
在非SpringBoot项目中引入lombok,并且使用@slf4j注解后打印日志信息。
异常现象
启动时报错Failed to load class “org.slf4j.impl.StaticLoggerBinder“,并且在实际输出打印日志的时候无日志输出(无论什么日志级别都无法打印输出)。
错误原因
在maven单独引入lombok时,lombok的@Slf4j注解只是静态引入slf4j,但lombok包里面本身并不包含slf4j-api以及基于slf4j的实现包,所以会报错无法加载slf4j相关class,而且SpringBoot项目中使用时之所以不报错是因为Spring庞大的依赖树里已经为你的项目默默引入了logback(slf4j实现库),所以这种现象在常用的SpringBoot项目里没有报出错误。 SpringBoot项目对logback的依赖如下: 这是starter依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
<version>2.4.2</version>
<scope>compile</scope>
</dependency>
这是进入starter-logging后看到的依赖
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-to-slf4j</artifactId>
<version>2.13.3</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jul-to-slf4j</artifactId>
<version>1.7.30</version>
<scope>compile</scope>
</dependency>
解决方式
既然是没有引入接口和以来,那么找一个基于slf4j-api的实现包即可,注入logback,log4j等等,下面我是直接根据spring的依赖引入显式引入的
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
当然,也有很多文章说还要单独引入slf4j-api的依赖,其实不需要,在logback依赖里已经包含了slf4j-api的依赖。如果是直接引用的lombok的jar包,而jar包在打包时没有将lombok的pom依赖一起打包,就需要单独引入slf4j-api。 这是logback的依赖,可以看到第二个依赖就是slf4j-api的依赖引入,所以无需再次引入slf4j-api依赖。
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j.version}</version>
<scope>compile</scope>
</dependency>
...
另外,有兴趣的小伙伴可以关注公众号【暴走的怪兽君】,常更新Java干货资讯,免费提供大量教程和工具下载。