2016-09-22 489 views
2

我正在使用Tomcat來部署java webapp。java.lang.NoClassDefFoundError:Lorg/apache/logging/log4j/Logger;但工件存在

我得到一個很長的堆棧跟蹤,總之:現在

GRAVE: A child container failed during start 
java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/new-webapp]] 
[...] 
Caused by: java.lang.NoClassDefFoundError: Lorg/apache/logging/log4j/Logger; 
    at java.lang.Class.getDeclaredFields0(Native Method) 
    at java.lang.Class.privateGetDeclaredFields(Class.java:2509) 
    at java.lang.Class.getDeclaredFields(Class.java:1819) 
    at org.apache.catalina.util.Introspection.getDeclaredFields(Introspection.java:106) 
    at org.apache.catalina.startup.WebAnnotationSet.loadFieldsAnnotation(WebAnnotationSet.java:256) 
    at org.apache.catalina.startup.WebAnnotationSet.loadApplicationFilterAnnotations(WebAnnotationSet.java:105) 
    at org.apache.catalina.startup.WebAnnotationSet.loadApplicationAnnotations(WebAnnotationSet.java:64) 
    at org.apache.catalina.startup.ContextConfig.applicationAnnotationsConfig(ContextConfig.java:335) 
    at org.apache.catalina.startup.ContextConfig.configureStart(ContextConfig.java:782) 
    at org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:306) 
    at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:95) 
    at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:90) 
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5150) 
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:147) 
    ... 6 more 
Caused by: java.lang.ClassNotFoundException: org.apache.logging.log4j.Logger 
    at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1305) 
    at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1139) 
    ... 20 more 
[...] 

,錯誤是相當清楚的。出於某種原因,log4j軟件包不在類路徑中。

應用程序是一個行家的webapp,而pom.xml的是這樣的:

<project 
    xmlns="http://maven.apache.org/POM/4.0.0" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>com.wb</groupId> 
    <artifactId>new-webapp</artifactId> 
    <packaging>war</packaging> 
    <version>0.0.1</version> 
    <properties> 
     <log4j.version>2.5</log4j.version> 
    </properties> 

    <dependencies> 
    [...] 
     <!-- Logging --> 
     <dependency> 
      <groupId>org.apache.logging.log4j</groupId> 
      <artifactId>log4j-api</artifactId> 
      <version>${log4j.version}</version> 
     </dependency> 
     <dependency> 
      <groupId>org.apache.logging.log4j</groupId> 
      <artifactId>log4j-core</artifactId> 
      <version>${log4j.version}</version> 
     </dependency> 
     <dependency> 
      <groupId>org.apache.logging.log4j</groupId> 
      <artifactId>log4j-web</artifactId> 
      <version>${log4j.version}</version> 
     </dependency> 
    </dependencies> 
    [...] 
</project> 

如果我去項目屬性,下Libraries-> Maven依賴我看到這一點:

enter image description here

找到了庫,下載並且它們在類路徑中。

我還試圖打開一個Java類,我的項目中,並宣佈

org.apache.logging.log4j.Logger Logger; 

沒有錯誤,Logger界面中找到。

這是怎麼回事?爲什麼即使庫位於類路徑中,Tomcat也無法啓動?


編輯 - 這是log4j的配置文件:

<?xml version="1.0" encoding="UTF-8"?> 
<Configuration status="INFO"> 
    <Appenders> 
     <Console name="Console" target="SYSTEM_OUT"> 
      <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" /> 
     </Console> 
    </Appenders> 
    <Loggers> 
     <Root level="INFO"> 
      <AppenderRef ref="Console" /> 
     </Root> 
    </Loggers> 
</Configuration> 
+0

我看不到圖像,但這是Eclipse的權利?您是在IDE內還是在外部Tomcat中部署?如果在IDE中,確保你清理了服務器和項目以及任何臨時文件,還要確保使用最新的m2e和m2e-wtp。如果你用'mvn clean package'打包戰爭,這些庫是否存在於'WEB-INF/lib'中? – Tunaki

+0

@Tunaki我在eclipse中部署,我已經嘗試清除Tomcat,Project和Tomcat工作目錄。如果我在eclipse服務器路徑下的wtpwebapps下,在WEB-INF/lib下可以看到三個jog4j罐。 – BackSlash

+0

請檢查這一點,我看到有很多步驟需要遵循,同時使用tomcat8 log4j https://tomcat.apache.org/tomcat-8.0-doc/logging.html – piyushj

回答

4

通過您所做的描述,我假設你正在使用Eclipse工作。

那麼,你最好去Project properties - >Deployment assembly,並確保包含maven dependencies條目。

我經常試驗一下,只要你執行MavenUpdate Project就會錯過這個配置。

+0

是的,它也發生在我之前,但事實並非如此,Maven Dependencies在那裏,'WEB-INF/lib'作爲部署路徑 – BackSlash

+0

@ BackSlash和log4j包含在'Maven Dependencies'條目中,當然? –

+1

是的,如圖所示。 log4j之一,所有來自加載maven的庫,他們不會給出錯誤,log4j確實很漂亮 – BackSlash

0

確保log4j庫不包含在Tomcat運行時(也不是已經認可的目錄)中,因爲它可能會產生有關類加載策略的衝突。

+0

Tomcat是一個全新安裝,版本8.0.37昨天從Apache網站下載。這些庫是:http://i.stack.imgur.com/nr2F2.png – BackSlash