- Published on
三方包间接依赖log4j问题
- Authors

- Name
- gulu
问题背景
项目引入的三方包依赖log4j,导致初始化三方包对象时,代码运行时异常报错,主要是log4j未找到。
三方包依赖的是log4j 1.*版本的api
之前项目是springboot 1.4.7 + logback,本身不使用log4j作为日志输出,特意 exclusions 掉了 log4j的依赖,默认兼容会使用 spring-boot-starter-logging 包中的 log4j-over-slf4j

但是随着项目升级到了 springboot 2.2.2 ,es也进行了升级,spring-boot-starter-logging 包中已替换成了logback 作为默认日志框架,log4j-to-slf4j 默认使用log4j2 ,因为不使用,被exclusions掉了,其他三方包间接依赖log4j的地方也都被exclusions。

问题详情
java.lang.NoClassDefFoundError: org/apache/log4j/Logger
......
Caused by: java.lang.ClassNotFoundException: org.apache.log4j.Logger
这就导致了三方包初始化时找不到log4j的问题。
解决过程
- 主动加入log4j的依赖,引入了 log4j2 的包,运行后依然报错,大概原因是三方包原来使用log4j1版本,高版本无法兼容,而且log4j2中的包名路径也发生了改变。
- 引入log4j starter,也不行。springboot2默认使用log4j2版本,以为做了兼容api的逻辑,但是并没有效果。
- 引入
log4j-1.2-api包,再次测试,发现问题解决。后查阅文章,这个包是log4j一个桥接包,兼容log4j老版本的api
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-1.2-api</artifactId>
</dependency>