2012-03-14 42 views
1

我在我的POM文件以下Maven的依賴:SLF4J:java.lang.IllegalStateException:org.slf4j.LoggerFactory無法成功初始化

<!-- depends on slf4j-api, log4j --> 
<dependency> 
    <groupId>org.slf4j</groupId> 
    <artifactId>slf4j-log4j12</artifactId> 
    <version>1.6.4</version> 
</dependency> 

當我部署項目到Tomcat,我得到錯誤信息:

SEVERE: Exception sending context destroyed event to listener instance of class org.springframework.web.context.ContextLoaderListener 
java.lang.ExceptionInInitializerError 
    at org.springframework.web.context.ContextLoaderListener.contextDestroyed(ContextLoaderListener.java:80) 
    at org.apache.catalina.core.StandardContext.listenerStop(StandardContext.java:4819) 
    at org.apache.catalina.core.StandardContext.stopInternal(StandardContext.java:5466) 
    at org.apache.catalina.util.LifecycleBase.stop(LifecycleBase.java:232) 
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:160) 
    at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:895) 
    at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:871) 
    at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:615) 
    at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:958) 
    at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1599) 
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471) 
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334) 
    at java.util.concurrent.FutureTask.run(FutureTask.java:166) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603) 
    at java.lang.Thread.run(Thread.java:722) 
Caused by: java.lang.IllegalStateException: org.slf4j.LoggerFactory could not be successfully initialized. See also http://www.slf4j.org/codes.html#unsuccessfulInit 
    at org.slf4j.LoggerFactory.getILoggerFactory(LoggerFactory.java:288) 
    at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:252) 
    at org.apache.commons.logging.impl.SLF4JLogFactory.getInstance(SLF4JLogFactory.java:155) 
    at org.apache.commons.logging.impl.SLF4JLogFactory.getInstance(SLF4JLogFactory.java:131) 
    at org.apache.commons.logging.LogFactory.getLog(LogFactory.java:685) 
    at org.springframework.web.context.ContextCleanupListener.<clinit>(ContextCleanupListener.java:43) 
    ... 16 more 

當我看着部署war文件,我在戰爭中看到文件中的以下jar文件(其中包括):

slf4j-api-1.6.4.jar 
slf4j-log4j12-1.6.4.jar 

奇怪的是,我看不出有什麼log4j.jar(即使它的slf4j-log4j12-1.6.4.jar

問題的相關性:

  1. 爲什麼log4j.jar不被打包在war文件?

  2. 錯誤信息意味着什麼以及如何解決它?

+0

在哪裏你部署你的應用程序? - 應用程序服務器 – 2012-03-15 07:34:39

+0

在'C:\ ..... \ tomcat \ apache-tomcat-7.0.26 \ webapps'中 – rapt 2012-03-15 15:44:52

回答

1

簡單的事情是,因爲你沒有給它在你的pom的依賴,原因SLF4J是一個記錄的門面,這意味着你必須給它真正的實現。該錯誤消息爲您提供此錯誤原因的解釋提示。

+0

基本上你是對的,'slf4j'是一個不依賴任何特定實現的API。但是我已經包含了'slf4j-log4j12'的依賴關係,它是slf4j API和log4j之間的橋樑。你可以在這裏看到http://mvnrepository.com/artifact/org.slf4j/slf4j-log4j12/1.6.4它依賴'slf4j-api'和'log4j',但由於某些原因只有'slf4j-api'被添加到war文件中(其他則是'slf4j-log4j12')... **爲什麼?** – rapt 2012-03-14 14:52:37

+0

log4j依賴本身是從slf4j視圖中「提供」給出的。所以你必須自己添加特定版本的log4j(例如log4j-1.2.16等)。 – khmarbaise 2012-03-14 14:54:16

+1

你在哪裏看到「提供」? slf4j-log4j12從父項目(' pom')中獲取它的作用域,它具有默認作用域(compile)。 – rapt 2012-03-14 17:49:39

0

我也得到了這個錯誤,我在我的war文件中實際上有log4j.jar。 但在我的情況下,它證明是一個類加載器問題:我在我的shared/lib中有一個試圖用slf4j登錄的jar,但該classloader沒有log4j可用。

2

由於存儲庫中存在錯誤的jar文件,導致此問題。刪除Maven存儲庫中的整個log4j目錄將修復它,只要我做了Maven> Update Dependencies並重新下載它們。

enter image description here

0

看來,如果你需要降級項目以SLF4J 1.4.2與你的tomcat提供的log4j的工作。它們是二進制不兼容的。之後你還會繼續提供,所以你不會把它們包括在內。

另一種方法是讓另一個項目包含這些庫本身並從tomcat中刪除。我知道在tomcat上沒有其他的排除機制。

作參考,並可能沒有幫助,我目前部署在WebLogic,它有一個部署規範,允許一個排除服務器普通類和使用捆綁的類來代替,如下面的代碼片段(參考)