SLF4J:java.lang.IllegalStateException:org.slf4j.LoggerFactory无法成功初始化

时间:2012-03-14 13:24:39

标签: maven dependencies log4j maven-3 slf4j

我的pom文件中有以下maven依赖项:

<!-- 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文件时,我在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. 错误消息的含义以及解决方法是什么?

4 个答案:

答案 0 :(得分:2)

由于存储库中的jar文件不正确,我遇到了这个问题。删除Maven存储库中的整个log4j目录,一旦我执行了Maven&gt;就修复了它。更新依赖关系并重新下载它们。

enter image description here

答案 1 :(得分:1)

简单的一点是,因为你没有把它作为你的pom中的依赖,因为slf4j是一个日志门面,这意味着你必须用它给出真正的实现。错误消息为您提供了解释此错误原因的提示。

答案 2 :(得分:0)

我也遇到了这个错误,实际上我的war文件中有log4j.jar。 但事实证明这是我的一个类加载器问题:我的共享/ lib中有一个jar,试图用slf4j登录,但是类加载器没有log4j可用。

答案 3 :(得分:0)

似乎您需要将项目降级到slf4j 1.4.2以使用tomcat中可用的log4j。它们是二进制不兼容的。你也可以在之后继续提供,所以你不要把它们包括在内。

另一种方法是让其他项目包含库本身并从tomcat中删除。我知道tomcat上没有其他排除机制。

供参考,可能没有帮助,我目前部署在weblogic上,它有一个部署规范,允许排除服务器公共类并改为使用捆绑类,例如下面的代码片段(带参考)