无法启动tomcat 7:引起:java.lang.NoClassDefFoundError

时间:2016-05-25 17:34:23

标签: java tomcat tomcat7

我的网络项目运行正常,直到昨天,但今天当我启动我的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和classpath,然后添加了" log4j-web-2.3.jar"和" log4j-1.2.17.jar"在WEB-INF / 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"/>

5 个答案:

答案 0 :(得分:4)

你的<Listener>中有一个自定义server.xml引用了一个对Log4j有静态依赖的类,你没有将Log4j jar文件添加到Tomcats类路径,即$TOMCAT_HOME/lib 1}}(或$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.jarLog4jServletContainerInitializer包中包含org.apache.logging.log4j.web。 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)。

答案 1 :(得分:2)

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

答案 2 :(得分:0)

程序中的LifecycleListener接口存在问题。通常,要了解LifecycleListener问题的原因通常特别困难,因为通常存在大量依赖项。我的建议是废弃包含LifecycleListener的文件内容,并确保删除任何可能依赖它的重定义。然后从头开始重建。

这可能不是修复错误的最快捷方式,但它很可能是最有效的,也是最有可能阻止您将来再犯错误的方法。

答案 3 :(得分:0)

NoClassDefFound错误通常与类路径问题无关,因此集中注意力是徒劳的。我建议在tomcat中使用默认设置部署ur web应用程序,然后逐个自定义以查找问题。

答案 4 :(得分:-1)

尝试添加:

org.slf4j slf4j-api 1.7.21