无法启动 tomcat 7:原因:java.lang.NoClassDefFoundError

Unable to start tomcat 7: Caused by: java.lang.NoClassDefFoundError

我的网络项目 运行 直到昨天都还不错,但是今天当我启动我的 tomcat 服务器 7 时,它无法启动,并在 eclipse 中出现以下错误:

Caused by: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/CiscoQA_Automation_Framework]]
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:154)
... 7 more
Caused by: java.lang.NoClassDefFoundError: org/apache/logging/log4j/Logger
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:264)
at org.apache.catalina.startup.WebappServiceLoader.loadServices(WebappServiceLoader.java:192)
at org.apache.catalina.startup.WebappServiceLoader.load(WebappServiceLoader.java:157)
at org.apache.catalina.startup.ContextConfig.processServletContainerInitializers(ContextConfig.java:1577)
at org.apache.catalina.startup.ContextConfig.webConfig(ContextConfig.java:1281)
at org.apache.catalina.startup.ContextConfig.configureStart(ContextConfig.java:889)
at org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:386)
at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:117)
at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:90)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5419)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
... 7 more
Caused by: java.lang.ClassNotFoundException: org.apache.logging.log4j.Logger
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1722)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1573)
... 19 more

在引用 here 和其他一些链接后,我清理了 WEB-INF/lib 和 class 路径,然后在 [=] 中添加了 "log4j-web-2.3.jar" 和 "log4j-1.2.17.jar" 21=] 和 class 路径。我已经尝试清理项目和 tomcat 工作目录,但没有任何效果。

<Server port="8005" shutdown="SHUTDOWN">
  <Listener className="org.apache.catalina.startup.VersionLoggerListener"/>
  <!-- Security listener. Documentation at /docs/config/listeners.html
  <Listener className="org.apache.catalina.security.SecurityListener" />
  -->
  <!--APR library loader. Documentation at /docs/apr.html -->
  <Listener SSLEngine="on"          className="org.apache.catalina.core.AprLifecycleListener"/>
  <!--Initialize Jasper prior to webapps are loaded. Documentation at /docs/jasper-howto.html -->
  <Listener className="org.apache.catalina.core.JasperListener"/>
  <!-- Prevent memory leaks due to use of particular java/javax APIs-->
  <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener"/>
  <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener"/>
  <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener"/>

您程序中的 LifecycleListener 接口有问题。通常很难理解 LifecycleListener 问题的原因,因为通常存在大量依赖项。我的建议是废弃包含您的 LifecycleListener 的文件的内容,并确保删除任何可能依赖它的体面。然后从头重构。

这可能不是修复错误的最快途径,但很可能是最有效的途径,也是最有可能阻止您在未来出现更多错误的途径。

您的 server.xml 中有一个自定义 <Listener>,它引用了对 Log4j 具有静态依赖性的 class,并且您没有将 Log4j jar 文件添加到 Tomcats class路径,即 $TOMCAT_HOME/lib(或 $TOMCAT_BASE/lib)文件夹。

删除侦听器或添加缺少的 jar 文件。


更新

您说您添加了 log4j-web-2.3.jarlog4j-1.2.17.jar,但错误消息显示缺少 org.apache.logging.log4j.Logger

log4j-1.2.17.jar 有一个 org.apache.log4j.Logger,所以这是错误的 Log4j 版本。

log4j-web-2.3.jar 在包 org.apache.logging.log4j.web 中包含一个 Log4jServletContainerInitializer。 Tomcat 只需在那里就可以自动加载它。这是需要org.apache.logging.log4j.Logger的class。

org.apache.logging.log4j.Logger可以在log4j-api-2.3.jar中找到,所以你需要这个文件,但它只是API。您还需要 log4j-core-2.3.jar,这是实际的 Log4J 2 实现。

如果您没有使用 Log4j 1 的代码 API,请删除 log4j-1.2.17.jar。如果您确实有使用旧 API 的代码,请将该文件替换为 log4j-1.2-api-2.3.jar,这会将旧 API 调用重定向到新 API。这消除了配置两者的需要,并允许单个日志文件,无论使用的 API 版本如何。

总结:您需要以下文件:

  • log4j-api-2.3.jar
  • log4j-core-2.3.jar
  • log4j-web-2.3.jar
  • log4j-1.2-api-2.3.jar (替换 log4j-1.2.17.jar,仅在旧代码需要时添加)

趁此升级到最新版本 (2.5)。

NoClassDefFound 错误通常与类路径问题无关,因此关注那里是徒劳的。我建议使用默认设置在 tomcat 中部署您的 Web 应用程序,然后逐一进行自定义以查找问题。

有时,当您的 war 中有多个 log4j 版本并且它们发生冲突时,就会发生这种情况。如果这是一个 Maven 构建,请使用 mvn dependendency:tree 来确保您没有传递引入多个版本的 log4j。我将从查看您的 $TOMCAT_HOME/webapps/{your_app_name_goes_here}/WEB-INF/lib 目录开始。我猜它今天停止工作的原因是因为 class 加载程序决定今天首先加载其他版本的 log4j。

尝试添加:

org.slf4j slf4j-api 1.7.21