SLF4J:java.lang.IllegalStateException:org.slf4j.Lo

2019-09-26 20:57发布

我在我的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文件,我在战争中看到文件中的以下jar文件(其中包括):

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

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

问题:

  1. 为什么log4j.jar没有在战争中的文件打包?

  2. 什么是错误讯息,以及如何解决呢?

Answer 1:

我有这个问题,由于在资源库中一个糟糕的jar文件。 删除整个log4j在Maven仓库目录固定一次我做的Maven>更新相关的更新,并重新下载它们。



Answer 2:

简单的事情是,因为你没有给它在你的pom的依赖,原因SLF4J是一个记录的门面,这意味着你必须给它真正的实现。 错误信息给你一个提示这个错误的原因的解释。



Answer 3:

我得到这个错误也和我其实在我的战争文件log4j.jar。 但它竟然在我的情况下,一个类加载器的问题:我在我的共享/ lib目录罐子它试图记录与SLF4J但类加载器没有log4j的使用。



Answer 4:

看来,如果你需要降级项目以SLF4J 1.4.2与你的tomcat提供的log4j的工作。 他们是二进制兼容。 您也将挂在事后提供的,所以你不包括他们的两倍。

另一种方法是让其他项目包括库本身,并从Tomcat共同删除。 我知道的是tomcat没有其他的排斥机制。

作为参考,而且可能没有帮助,我目前部署在WebLogic,它有一个部署规范,允许一个排除服务器公共类和使用捆绑类代替,如下面的代码片段(参考)



文章来源: SLF4J: java.lang.IllegalStateException: org.slf4j.LoggerFactory could not be successfully initialized