【问题标题】:SLF4J: java.lang.IllegalStateException: org.slf4j.LoggerFactory could not be successfully initializedSLF4J: java.lang.IllegalStateException: org.slf4j.LoggerFactory 无法成功初始化
【发布时间】:2012-03-14 13:24:39
【问题描述】:

我的 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

当我查看部署的战争文件时,我在战争文件中看到以下 jars(以及其他):

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. 错误信息是什么意思,如何解决?

【问题讨论】:

  • 你在哪里部署你的应用程序? - 应用服务器
  • C:\.....\tomcat\apache-tomcat-7.0.26\webapps

标签: maven dependencies log4j maven-3 slf4j


【解决方案1】:

由于存储库中的 jar 文件错误,我遇到了这个问题。一旦我执行 Maven > Update Dependencies 并重新下载它们,删除 Maven 存储库中的整个 log4j 目录即可修复它。

【讨论】:

    【解决方案2】:

    简单的事情是,因为你没有在你的 pom 中把它作为依赖,因为 slf4j 是一个日志外观,这意味着你必须用它来提供真正的实现。错误消息提示您解释此错误的原因。

    【讨论】:

    • 基本上你是对的,slf4j 是一个不依赖于任何特定实现的 API。但是我已经包含了slf4j-log4j12 的依赖关系,它是 slf4j API 和 log4j 之间的桥梁。你可以在这里看到mvnrepository.com/artifact/org.slf4j/slf4j-log4j12/1.6.4,它依赖于slf4j-apilog4j,但由于某种原因,只有slf4j-api 被添加到war 文件中(除slf4j-log4j12 之外)... 为什么?
    • log4j 依赖项本身在 slf4j 视图中作为“提供”给出。所以你必须自己添加特定版本的 log4j(例如 log4j-1.2.16 等)。
    • 您在哪里看到“提供”? slf4j-log4j12 从具有默认范围(编译)的父项目(&lt;packaging&gt;pom&lt;/packaging&gt;)获取其范围。
    【解决方案3】:

    我也遇到了这个错误,实际上我的 war 文件中有 log4j.jar。 但在我的情况下,这是一个类加载器问题:我的 shared/lib 中有一个 jar,它试图使用 slf4j 进行日志记录,但该类加载器没有可用的 log4j。

    【讨论】:

      【解决方案4】:

      似乎您需要将项目降级到 slf4j 1.4.2 才能使用您的 tomcat 中可用的 log4j。它们是二进制不兼容的。之后你也会坚持提供,所以你不要把它们加倍。

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

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

      【讨论】:

        猜你喜欢
        • 2015-06-30
        • 2017-06-10
        • 1970-01-01
        • 2023-04-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-11-12
        • 1970-01-01
        相关资源
        最近更新 更多