Published on

三方包间接依赖log4j问题

Authors
  • avatar
    Name
    gulu
    Twitter

问题背景

项目引入的三方包依赖log4j,导致初始化三方包对象时,代码运行时异常报错,主要是log4j未找到。

三方包依赖的是log4j 1.*版本的api

之前项目是springboot 1.4.7 + logback,本身不使用log4j作为日志输出,特意 exclusions 掉了 log4j的依赖,默认兼容会使用 spring-boot-starter-logging 包中的 log4j-over-slf4j

avatar

但是随着项目升级到了 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>

参考

  1. spring boot log4j2与三方依赖库log4j冲突无法初始化问题解决方法
  2. 关于Log4j 1.x 升级Log4j 2.x 那些事