Tomcat启动失败:java.lang.NoClassDefFoundError问题求助
Tomcat启动失败:Log4j相关NoClassDefFoundError问题
启动Tomcat服务器时触发Log4jServletContextListener初始化事件失败,报错核心为java.lang.NoClassDefFoundError: org/apache/logging/log4j/core/util/SetUtils,具体配置及完整日志如下:
1. Gradle依赖配置
dependencies{ ... implementation 'org.apache.logging.log4j:log4j-core:2.12.2' implementation 'org.apache.logging.log4j:log4j-web:2.12.2' ... }
2. web.xml配置
... <context-param> <param-name>isLog4jAutoInitializationDisabled</param-name> <param-value>true</param-value> </context-param> <listener> <listener-class>org.apache.logging.log4j.web.Log4jServletContextListener</listener-class> </listener> ...
完整报错日志
12-Nov-2022 13:11:37.918 INFO [localhost-startStop-1] org.apache.catalina.core.ApplicationContext.log 1 Spring WebApplicationInitializers detected on classpath 12-Nov-2022 13:11:37.981 SEVERE [localhost-startStop-1] org.apache.catalina.core.StandardContext.listenerStart Exception sending context initialized event to listener instance of class [org.apache.logging.log4j.web.Log4jServletContextListener] java.lang.NoClassDefFoundError: org/apache/logging/log4j/core/util/SetUtils at org.apache.logging.log4j.web.Log4jWebInitializerImpl.getConfigURI(Log4jWebInitializerImpl.java:196) at org.apache.logging.log4j.web.Log4jWebInitializerImpl.initializeNonJndi(Log4jWebInitializerImpl.java:175) at org.apache.logging.log4j.web.Log4jWebInitializerImpl.start(Log4jWebInitializerImpl.java:112) at org.apache.logging.log4j.web.Log4jServletContextListener.contextInitialized(Log4jServletContextListener.java:64) at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4745) at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5207) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:752) at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:728) at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:734) at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:986) at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1857) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) at java.util.concurrent.FutureTask.run(FutureTask.java:266) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at java.lang.Thread.run(Thread.java:748) Caused by: java.lang.ClassNotFoundException: org.apache.logging.log4j.core.util.SetUtils at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1291) at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1119) ... 17 more
解决方法
方法1:强制刷新依赖并检查打包完整性
- 执行命令
gradle clean build --refresh-dependencies,强制刷新依赖缓存并重新构建项目。 - 解压构建后的WAR包,检查
WEB-INF/lib目录下是否存在log4j-core-2.12.2.jar,若缺失需排查Gradle是否存在依赖排除或冲突规则。
方法2:排除Log4j版本冲突
若项目中第三方依赖引入了其他版本的Log4j,需统一版本并排除冲突:
dependencies{ ... implementation 'org.apache.logging.log4j:log4j-core:2.12.2' implementation 'org.apache.logging.log4j:log4j-web:2.12.2' // 全局排除非指定版本的Log4j依赖 configurations.all { exclude group: 'org.apache.logging.log4j', module: 'log4j-core', version: '!=2.12.2' exclude group: 'org.apache.logging.log4j', module: 'log4j-web', version: '!=2.12.2' } ... }
方法3:调整依赖范围适配Tomcat类加载
将implementation替换为compileOnly+runtimeOnly,确保依赖被正确打包到WAR中:
dependencies{ ... compileOnly 'org.apache.logging.log4j:log4j-core:2.12.2' runtimeOnly 'org.apache.logging.log4j:log4j-core:2.12.2' compileOnly 'org.apache.logging.log4j:log4j-web:2.12.2' runtimeOnly 'org.apache.logging.log4j:log4j-web:2.12.2' ... }
方法4:升级Log4j版本(推荐)
2.12.2版本存在较多已知问题,建议升级到稳定版本(如2.17.1),同时修复类加载相关bug:
dependencies{ ... implementation 'org.apache.logging.log4j:log4j-core:2.17.1' implementation 'org.apache.logging.log4j:log4j-web:2.17.1' ... }
内容的提问来源于stack exchange,提问作者Kai-Eiji
相关产品推荐
相关产品推荐

