Web应用启动遇Log4j VerifyError问题求助:类重写final方法
Log4j VerifyError 问题排查与解决
运行Web应用时出现以下Log4j错误:
java.lang.VerifyError: class org.apache.log4j.bridge.LogEventAdapter overrides final method getTimeStamp.()J at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClass(ClassLoader.java:756) at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) at org.apache.catalina.loader.WebappClassLoaderBase.findClassInternal(WebappClassLoaderBase.java:2470) at org.apache.catalina.loader.WebappClassLoaderBase.findClass(WebappClassLoaderBase.java:875) at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1376) at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1220) at org.apache.log4j.builders.BuilderManager.<clinit>(BuilderManager.java:58) at org.apache.log4j.config.Log4j1Configuration.<init>(Log4j1Configuration.java:46) at org.apache.log4j.config.PropertiesConfiguration.<init>(PropertiesConfiguration.java:90) at org.apache.log4j.config.PropertiesConfigurationFactory.getConfiguration(PropertiesConfigurationFactory.java:58) at org.apache.logging.log4j.core.config.ConfigurationFactory$Factory.getConfiguration(ConfigurationFactory.java:499) at org.apache.logging.log4j.core.config.ConfigurationFactory$Factory.getConfiguration(ConfigurationFactory.java:404) at org.apache.logging.log4j.core.config.ConfigurationFactory.getConfiguration(ConfigurationFactory.java:318) at org.apache.logging.log4j.core.LoggerContext.reconfigure(LoggerContext.java:690) at org.apache.logging.log4j.core.LoggerContext.reconfigure(LoggerContext.java:711) at org.apache.logging.log4j.core.LoggerContext.start(LoggerContext.java:253) at org.apache.logging.log4j.core.impl.Log4jContextFactory.getContext(Log4jContextFactory.java:155) at org.apache.logging.log4j.core.impl.Log4jContextFactory.getContext(Log4jContextFactory.java:47) at org.apache.logging.log4j.LogManager.getContext(LogManager.java:196) at org.apache.commons.logging.LogAdapter$Log4jLog.<clinit>(LogAdapter.java:155)
类路径中相关的日志类包:
/ews/lib/log4j-api-2.20.0.jar /ews/lib/log4j-core-2.20.0.jar /ews/lib/commons-logging-1.2.jar /ews/lib/log4j-1.2-api-2.20.0.jar /ews/webapp/WEB-INF/lib/logback-core-1.2.10.jar /ews/webapp/WEB-INF/lib/log4j-api-2.20.0.jar /ews/webapp/WEB-INF/lib/log4jdbc-1.2.jar /ews/webapp/WEB-INF/lib/log4j-core-2.20.0.jar /ews/webapp/WEB-INF/lib/commons-logging-1.2.jar /ews/webapp/WEB-INF/lib/log4j-1.2-api-2.20.0.jar /cred/lib/commons-logging-1.2.jar
完整堆栈信息:
SEVERE: Exception sending context initialized event to listener instance of class [org.springframework.web.context.ContextLoaderListener] java.lang.VerifyError: class org.apache.log4j.bridge.LogEventAdapter overrides final method getTimeStamp.()J at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClass(ClassLoader.java:756) at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) at org.apache.catalina.loader.WebappClassLoaderBase.findClassInternal(WebappClassLoaderBase.java:2470) at org.apache.catalina.loader.WebappClassLoaderBase.findClass(WebappClassLoaderBase.java:875) at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1376) at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1220) at org.apache.log4j.builders.BuilderManager.<clinit>(BuilderManager.java:58) at org.apache.log4j.config.Log4j1Configuration.<init>(Log4j1Configuration.java:46) at org.apache.log4j.config.PropertiesConfiguration.<init>(PropertiesConfiguration.java:90) at org.apache.log4j.config.PropertiesConfigurationFactory.getConfiguration(PropertiesConfigurationFactory.java:58) at org.apache.logging.log4j.core.config.ConfigurationFactory$Factory.getConfiguration(ConfigurationFactory.java:499) at org.apache.logging.log4j.core.config.ConfigurationFactory$Factory.getConfiguration(ConfigurationFactory.java:404) at org.apache.logging.log4j.core.config.ConfigurationFactory.getConfiguration(ConfigurationFactory.java:318) at org.apache.logging.log4j.core.LoggerContext.reconfigure(LoggerContext.java:690) at org.apache.logging.log4j.core.LoggerContext.reconfigure(LoggerContext.java:711) at org.apache.logging.log4j.core.LoggerContext.start(LoggerContext.java:253) at org.apache.logging.log4j.core.impl.Log4jContextFactory.getContext(Log4jContextFactory.java:155) at org.apache.logging.log4j.core.impl.Log4jContextFactory.getContext(Log4jContextFactory.java:47) at org.apache.logging.log4j.LogManager.getContext(LogManager.java:196) at org.apache.commons.logging.LogAdapter$Log4jLog.<clinit>(LogAdapter.java:155) at org.apache.commons.logging.LogAdapter$Log4jAdapter.createLog(LogAdapter.java:122) at org.apache.commons.logging.LogAdapter.createLog(LogAdapter.java:89) at org.apache.commons.logging.LogFactory.getLog(LogFactory.java:67) at org.apache.commons.logging.LogFactory.getLog(LogFactory.java:59) at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:269) at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:103) at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4494) at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:4946) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1328) at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1318) at java.util.concurrent.FutureTask.run(FutureTask.java:266) at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75) at java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:134) at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:866) at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:795) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1328) at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1318) at java.util.concurrent.FutureTask.run(FutureTask.java:266) at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75) at java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:134) at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:866) at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:249) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) at org.apache.catalina.core.StandardService.startInternal(StandardService.java:428) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:923) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) at org.apache.catalina.startup.Tomcat.start(Tomcat.java:486) at org.apache.ranger.server.tomcat.EmbeddedServer.startServer(EmbeddedServer.java:380) at org.apache.ranger.server.tomcat.EmbeddedServer.start(EmbeddedServer.java:331) at org.apache.ranger.server.tomcat.EmbeddedServer.main(EmbeddedServer.java:113) Jan 31, 2024 11:16:30 AM org.apache.catalina.core.StandardContext startInternal SEVERE: One or more listeners failed to start. Full details will be found in the appropriate container log file Jan 31, 2024 11:16:30 AM org.apache.catalina.core.StandardContext startInternal SEVERE: Context [] startup failed due to previous errors Jan 31, 2024 11:16:31 AM org.apache.catalina.core.ApplicationContext log INFO: Closing Spring root WebApplicationContext Jan 31, 2024 11:16:31 AM org.apache.catalina.core.StandardContext listenerStop SEVERE: Exception sending context destroyed event to listener instance of class [org.springframework.web.context.ContextLoaderListener] java.lang.NoClassDefFoundError: Could not initialize class org.apache.commons.logging.LogAdapter$Log4jLog at org.apache.commons.logging.LogAdapter$Log4jAdapter.createLog(LogAdapter.java:122) at org.apache.commons.logging.LogAdapter.createLog(LogAdapter.java:89) at org.apache.commons.logging.LogFactory.getLog(LogFactory.java:67) at org.apache.commons.logging.LogFactory.getLog(LogFactory.java:59) at org.springframework.web.context.ContextCleanupListener.<clinit>(ContextCleanupListener.java:44) at org.springframework.web.context.ContextLoaderListener.contextDestroyed(ContextLoaderListener.java:113) at org.apache.catalina.core.StandardContext.listenerStop(StandardContext.java:4540) at org.apache.catalina.core.StandardContext.stopInternal(StandardContext.java:5179) at org.apache.catalina.util.LifecycleBase.stop(LifecycleBase.java:257) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:187) at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1328) at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1318) at java.util.concurrent.FutureTask.run(FutureTask.java:266) at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75) at java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:134) at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:866) at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:795) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1328) at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1318) at java.util.concurrent.FutureTask.run(FutureTask.java:266) at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75) at java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:134) at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:866) at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:249) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) at org.apache.catalina.core.StandardService.startInternal(StandardService.java:428) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:923) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) at org.apache.catalina.startup.Tomcat.start(Tomcat.java:486) at org.apache.ranger.server.tomcat.EmbeddedServer.startServer(EmbeddedServer.java:380) at org.apache.ranger.server.tomcat.EmbeddedServer.start(EmbeddedServer.java:331) at org.apache.ranger.server.tomcat.EmbeddedServer.main(EmbeddedServer.java:113) Caused by: java.lang.ExceptionInInitializerError: Exception java.lang.VerifyError: class org.apache.log4j.bridge.LogEventAdapter overrides final method getTimeStamp.()J [in thread "main"] at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClass(ClassLoader.java:756) at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) at org.apache.catalina.loader.WebappClassLoaderBase.findClassInternal(WebappClassLoaderBase.java:2470) at org.apache.catalina.loader.WebappClassLoaderBase.findClass(WebappClassLoaderBase.java:875) at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1376) at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1220) at org.apache.log4j.builders.BuilderManager.<clinit>(BuilderManager.java:58) at org.apache.log4j.config.Log4j1Configuration.<init>(Log4j1Configuration.java:46) at org.apache.log4j.config.PropertiesConfiguration.<init>(PropertiesConfiguration.java:90) at org.apache.log4j.config.PropertiesConfigurationFactory.getConfiguration(PropertiesConfigurationFactory.java:58) at org.apache.logging.log4j.core.config.ConfigurationFactory$Factory.getConfiguration(ConfigurationFactory.java:499) at org.apache.logging.log4j.core.config.ConfigurationFactory$Factory.getConfiguration(ConfigurationFactory.java:404) at org.apache.logging.log4j.core.config.ConfigurationFactory.getConfiguration(ConfigurationFactory.java:318) at org.apache.logging.log4j.core.LoggerContext.reconfigure(LoggerContext.java:690) at org.apache.logging.log4j.core.LoggerContext.reconfigure(LoggerContext.java:711) at org.apache.logging.log4j.core.LoggerContext.start(LoggerContext.java:253) at org.apache.logging.log4j.core.impl.Log4jContextFactory.getContext(Log4jContextFactory.java:155) at org.apache.logging.log4j.core.impl.Log4jContextFactory.getContext(Log4jContextFactory.java:47) at org.apache.logging.log4j.LogManager.getContext(LogManager.java:196) at org.apache.commons.logging.LogAdapter$Log4jLog.<clinit>(LogAdapter.java:155) at org.apache.commons.logging.LogAdapter$Log4jAdapter.createLog(LogAdapter.java:122) at org.apache.commons.logging.LogAdapter.createLog(LogAdapter.java:89) at org.apache.commons.logging.LogFactory.getLog(LogFactory.java:67) at org.apache.commons.logging.LogFactory.getLog(LogFactory.java:59) at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:269) at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:103) at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4494) at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:4946) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
问题根源
这个VerifyError的核心原因是类路径中同时存在Log4j 1.x的核心类和Log4j 2.x的log4j-1.2-api桥接包,导致类定义冲突:
org.apache.log4j.bridge.LogEventAdapter是Log4j 2.x桥接包中的类,它试图继承Log4j 1.x的LoggingEvent类并覆盖其getTimeStamp()方法。- 但Log4j 1.x的
LoggingEvent中getTimeStamp()是final方法,不允许被覆盖,类加载时触发验证错误。
从你的类路径看,log4jdbc-1.2.jar大概率包含了Log4j 1.x的核心类,或者存在其他未列出的Log4j 1.x依赖,引发了冲突。
解决方案
1. 移除冲突的Log4j 1.x类
- 检查并删除类路径中所有Log4j 1.x的核心jar(如
log4j-1.2.x.jar)。 - 替换
log4jdbc-1.2.jar为兼容Log4j 2.x
相关产品推荐
相关产品推荐

