Tomcat 9.0.50移除log4j1.2-api桥接包启动报错咨询
问题解答
核心结论
不是Tomcat9只能搭配桥接包用Log4j2,而是你的项目里还有代码或依赖在调用Log4j 1.x的API(比如org.apache.log4j.Logger)。移除桥接包后,JVM找不到这些老API的类,自然就报错了。
报错原因分析
看报错栈里最关键的一行:
Caused by: java.lang.NoClassDefFoundError: Lorg/apache/log4j/Logger;
这说明Tomcat扫描Web应用时,发现某个类里声明了org.apache.log4j.Logger类型的字段,但这个类在当前类路径里找不到。而log4j-1.2-api桥接包的作用就是提供这些Log4j 1.x的API类,把调用转接到Log4j 2的核心实现上——没了它,老代码的调用就找不到对应类了。
解决办法
你有两个方向可选:
- 保留桥接包:这是最省事的方案,不用改代码就能兼容原有Log4j 1.x的调用逻辑,同时用Log4j 2的核心功能。
- 彻底切换到Log4j 2原生API:
- 全局搜项目代码,把所有
import org.apache.log4j.Logger换成import org.apache.logging.log4j.Logger,日志初始化代码也要改——比如Logger.getLogger()换成LogManager.getLogger()。 - 查项目依赖树,把第三方库带进来的Log4j 1.x依赖(比如
log4j:log4j)全排除掉。 - 只保留
log4j-api-2.17.1.jar和log4j-core-2.17.1.jar这两个包就行。
- 全局搜项目代码,把所有
Tomcat9与Log4j2的兼容性说明
Tomcat9本身对Log4j2没有强制要求必须用桥接包,只要你的应用完全用Log4j 2的原生API,只引入log4j-api和log4j-core就能正常跑。桥接包只是给还没完全迁移的遗留项目用的过渡方案。
内容的提问来源于stack exchange,提问作者Ajay Nakhare
相关产品推荐
相关产品推荐

