【问题标题】:Unable to start tomcat 7: Caused by: java.lang.NoClassDefFoundError无法启动tomcat 7:原因:java.lang.NoClassDefFoundError
【发布时间】:2016-05-25 17:34:23
【问题描述】:

我的网络项目直到昨天都运行良好,但是今天当我启动我的 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 和类路径,然后在 WEB-INF 中添加了“log4j-web-2.3.jar”和“log4j-1.2.17.jar” /lib 和类路径。我已经尝试清理项目和 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"/>

【问题讨论】:

  • 我也尝试使用“logback-classic-1.0.13.jar”和“logback-core-1.0.13.jar”罐子,但没有解决问题
  • 你在使用eclipse JUNO吗?
  • @holidayCoder:不,它的版本:Mars Release (4.5.0)

标签: java tomcat tomcat7


【解决方案1】:

您的server.xml 中有一个自定义&lt;Listener&gt;,它引用了一个静态依赖于Log4j 的类,并且您没有将Log4j jar 文件添加到Tomcats 类路径,即添加到$TOMCAT_HOME/lib(或@ 987654324@) 文件夹。

要么移除监听器,要么添加缺失的 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的类。

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)。

【讨论】:

  • 我将 log4j jar 放在 "C:\XX\apache-tomcat-7.0.63-windows-x64\apache-tomcat-7.0.63\lib" 目录中并再次构建项目仍然相同问题用 server.xml 中的 更新了问题
  • 已解决问题,谢谢。能否概述一下何时以及为何使用此 log4j jar?
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 请注意 LifecycleListener 几乎肯定不是由 OP 编写的,因为他们描述的唯一更改是添加第三方库。有问题的库包含一个 LifecycleListener 来配置库并管理其资源。
    【解决方案4】:

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

    【讨论】:

    • ... NoClassDefFound 几乎总是是由类路径问题引起的,即类路径中不存在所需的类。
    【解决方案5】:

    尝试添加:

    org.slf4j slf4j-api 1.7.21

    【讨论】:

      猜你喜欢
      • 2013-04-23
      • 2013-12-30
      • 1970-01-01
      • 1970-01-01
      • 2012-02-14
      • 2012-08-20
      • 2014-04-24
      • 1970-01-01
      相关资源
      最近更新 更多