SLF4J: 无法加载类 "org.slf4j.impl.StaticLoggerBinder"。错误。

124
  • 关于 Eclipse IDEIndigoJunoKepler(32 位和 64 位版本))
  • 平台WindowsUbuntuMac
  • m2e 版本1.1.0.20120530-00091.2.0.20120903-10501.3.0.20130129-0926
    1.4.0.20130601-0317

概述

在将m2e更新到1.1版本后出现了上述错误。通过删除m2e 1.1并回滚到m2e 1.0,一切正常。我尝试在Windows和Ubuntu中重复该问题,但都给出了完全相同的错误。尝试了许多slf4j-api和logback的配置,但似乎没有一个有效。

错误出现在任何maven项目中甚至没有声明slf4j依赖项

  • 新建Maven项目-->maven-archetype-quickstart

    以及

  • 新建Maven项目-->没有原型选择的简单项目

    结果为

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".

测试环境和配置

在Mac上测试了Eclipse Indigo和Eclipse Juno(32位和64位),在Ubuntu上测试了32位,在Windows上测试了64位和32位。测试了Juno ClassicJuno Modelling toolsKepler StandardKepler Modelling Tools的新安装,并产生了相同的错误。

该错误出现在 clean, install, test, deploy, generate-sources, validate, compile, package, integration-test, verify 及清理目标与其他目标的组合中。它也出现在参数-e-X下。曾尝试删除m2e存储库并从头开始下载,但仍然没有成功。需要指出的是,在3台不同的机器和虚拟盒子上测试了上述系统,但都产生了相同的错误。

尝试了不同的logback配置(从1.0.4到1.0.13),解决了slf4j-api和logback-core依赖关系,但是仍然出现相同的错误。
<dependency>
   <groupId>ch.qos.logback</groupId>
   <artifactId>logback-classic</artifactId>
   <version></version>
</dependency>

尝试了不同的(从1.6.1到1.7.5)slf4j-simple配置。

<dependency>
   <groupId>org.slf4j</groupId>
   <artifactId>slf4j-simple</artifactId>
   <version></version>
   <scope>compile</scope>
</dependency>

我尝试了不同的(从1.6.1到1.7.5)log4j-over-slf4j配置。

<dependency>
   <groupId>org.slf4j</groupId>
   <artifactId>log4j-over-slf4j</artifactId>
   <version></version>
   <scope>compile</scope>
</dependency>

尝试了不同的(从1.6.1到1.7.5)slf4j-jdk14配置。

<dependency>
   <groupId>org.slf4j</groupId>
   <artifactId>slf4j-jdk14</artifactId>
   <version></version>
   <scope>compile</scope>
</dependency>

我尝试了各种不同版本(从1.6.1到1.7.5)的slf4j-log4j12配置。

<dependency>
     <groupId>org.slf4j</groupId>
     <artifactId>slf4j-log4j12</artifactId>
     <version></version>
     <scope>compile</scope>
</dependency>

尝试使用slf4j-nop 1.7.5配置。
<dependency>
  <groupId>org.slf4j</groupId>
  <artifactId>slf4j-nop</artifactId>
  <version>1.7.5</version>
  <scope>compile</scope>
</dependency>

最后,尽管出现错误,日志仍然被保存并打印。

重现错误的方法

  • 下载Eclipse Juno、Indigo或Kepler 32位或64位(所有安装都会导致相同的错误)。

  • 右键单击项目->运行为->清理安装(或上面提到的任何其他目标)
第一行控制台上的内容将是:
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.

"P.S. 在更新m2e版本至1.1.0.20120530-0009、1.2.0.20120903-1050、1.3.0.20130129-0926或1.4.0.20130601-0317后,现有项目将产生相同的错误。"


更新

编辑

m2e支持网站:

  • 上述问题已在m2e支持网站发布为错误报告,Igor Fedorenko的答复是:

    目前没有抑制此消息的即时计划。

    要查看上述错误报告,请参阅m2e官方支持网站


编辑2

  • 上述错误提示也适用于m2e版本1.2.0.20120903-1050


编辑3

  • 上述错误提示也适用于m2e版本1.3.0.20130129-0926


编辑4

  • 上述错误提示也适用于 m2e 版本 1.4.0.20130601-0317


编辑 5

                              ***Reported FIXED***

以下错误已在m2e版本1.5.0/Luna M3目标里程碑)中报告为已修复。该版本尚未可供下载。 Luna M3计划于11月15日发布。
最新的开发构建可在此处获得。
有关m2e里程碑的更多信息,请参阅m2e主存储库

@EliranMalka 这段话有点长,但是有原因。我试图帮助人们避免问相同的问题,并包含每个可能看起来必要的细节,以便理解他们是否面临相同的问题,这让我没有太多选择。 :-) - Konstantinos Margaritis
在尝试使用Spring Data和Neo4j时,我遇到了这个错误。我已经在slf4j-api-1.7.7jcl-over-slf4j-1.7.7中都有slf4j,如果我尝试删除它们中的任何一个,就会收到错误消息,说它们的Logger类丢失了。我该怎么办? - user1885868
@KonstantinosMargaritis,您能告诉我如何通过pom.xml修复这个问题吗?我在本地环境中可以运行它,但在Jenkins上总是失败。 - vikramvi
你的当前设置是什么,@vikramvi? - Konstantinos Margaritis
1
@KonstantinosMargaritis 感谢您回复。我意识到Linux上的Maven版本是3.0,已升级到最新版本并再次尝试。这解决了问题。但是我不得不花一整天的时间来找出可能出了什么问题。无论如何还是感谢您。 - vikramvi
欢迎 @vikramvi!很高兴你解决了它 :-) - Konstantinos Margaritis
12个回答

75

我也可以确认这个错误。

解决方法:使用外部maven代替m2eclipse内置的maven。

需要三个步骤:

1 在本地安装maven(测试机器是Ubuntu 10.10)

mvn --version

Apache Maven 2.2.1 (rdebian-4) Java version: 1.6.0_20 Java home: /usr/lib/jvm/java-6-openjdk/jre Default locale: de_DE, platform encoding: UTF-8 OS name: "linux" version: "2.6.35-32-generic" arch: "amd64" Family: "unix"

2 从控制台运行maven link how to run maven from console

> cd path-to-pom.xml
> mvn test
    [INFO] Scanning for projects...
    [INFO] ------------------------------------------------------------------------
    [INFO] Building Simple
    [INFO]    task-segment: [test]
    [INFO] ------------------------------------------------------------------------
    [...]
    [INFO] Surefire report directory: [...]/workspace/Simple/target/surefire-reports
    
    -------------------------------------------------------
     T E S T S
    -------------------------------------------------------
    Running net.tverrbjelke.experiment.MainAppTest
    Hello World
    Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.042 sec
    
    Results :
    
    Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
    
    [INFO] ------------------------------------------------------------------------
    [INFO] BUILD SUCCESSFUL
    [INFO] ------------------------------------------------------------------------
    [...]

在m2eclipse中切换从嵌入式maven到本地maven:

  • 找出本地maven的安装目录(mvn --version,或者搜索你的MAVEN_HOME,对于我来说,这个帮助了我/usr/share/maven2)
  • 在eclipse菜单->窗口->首选项->Maven->安装->输入该字符串。然后您应该已经切换到新的外部maven。
  • 然后运行您的项目,例如"maven test"。

错误消息应该已经消失了。


1
我接受你的答案,因为这是唯一的解决方法,可以绕过这个烦人的错误。非常感谢你分析性的回答。 :) - Konstantinos Margaritis
4
嗯,我在使用 Windows,并更换了新的外部安装程序,但错误仍然存在!? - stefan.at.kotlin
4
抱歉,它可行。请注意运行配置中 Maven 运行时选项(内部/外部),如果您使用的是已保存的配置,请确保进行更新。 - stefan.at.kotlin
很高兴听到它能正常工作。如果你愿意,你可以订阅该漏洞的邮件列表,以便在有变更时得到通知。 - Konstantinos Margaritis
2
对我来说,#mvn --version 很方便地显示了 MAVEN_HOME。 - biaobiaoqi

26

SLF4J网站中有一份文档来解决这个问题。我按照文档的指示添加了slf4j-simple-1.6.1.jar到我的应用程序,同时也加入了我已经有的slf4j-api-1.6.1.jar。这解决了我的问题。

slf4j


5
这个可以在Maven中添加:<dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-simple</artifactId> <version>1.X.X</version> </dependency> //只需将其中的版本号替换为你所需的版本 - Enrique San Martín
@Mohammed Irfan,我需要将这两个JAR文件添加到Eclipse的libs文件夹中吗? - Erum
1
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Rob Wilson

21
如果您正在使用Gradle,请添加以下内容:
dependencies { 
... 
compile "org.slf4j:slf4j-simple:1.7.9" 
... 
}

它在Gradle中可以工作!!你能解释一下当我们添加那个库时会发生什么吗? - Felipe Pereira

5

将以下代码复制到您的pom.xml文件中。它对我有效。

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-simple</artifactId>
    <version>1.6.1</version>
    <scope>test</scope>
</dependency>

它解决了“org.slf4j.impl.StaticLoggerBinder”错误,但现在记录了所有内容。我将log4j.xml和log4j.properties(一次一个)放在src/test/resources中,现在我的项目中的所有框架都记录了大量消息,除了我的自定义日志记录。 - OJVM

5

我曾在Gradle出现相同结果的类似错误,并成功解决,方法如下:

//compile 'org.slf4j:slf4j-api:1.7.1'
compile group: 'org.apache.logging.log4j', name: 'log4j-api', version: '2.1'
compile group: 'org.apache.logging.log4j', name: 'log4j-core', version: '2.1'
compile group: 'org.apache.logging.log4j', name: 'log4j-slf4j-impl', version: '2.1'

被注释的行是导致错误输出的行。我相信你可以将此转移到Maven。


3

您的Maven依赖文件中未指定版本,可能是因为它没有选择最新的JAR包。
此外,您需要另一个带有slf4j-log4j12工件ID的依赖项。
将其包含在您的pom文件中。

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-log4j12</artifactId>
    <version>1.5.6</version>
</dependency>

如果错误仍未解决,请告知我。
我也建议您查看此链接


4
已经检查了所有提到的版本。我没在那里声明它是为了避免重复。标签被故意留空。请注意,上述问题已经作为漏洞发布到m2e支持网站,并且除非由m2e开发人员抑制,否则无法解决上述错误。我已经多次阅读了该网站,并包含了所有可能解决该问题的库。不幸的是,由于涉及m2e而不是声明的依赖项,没有任何配置起作用。上述错误不会显示在maven控制台或Netbeans中,只会出现在Eclipse中。 - Konstantinos Margaritis
1
slf4j-log4j12是另一个绑定,与slf4j-simple、slf4j-jdk14和logback-classic一起。以上任何依赖项都应该解决绑定问题。正如我之前解释的那样,问题出在m2e上。无论如何,还是谢谢。 - Konstantinos Margaritis

1

请提供完整答案,而非链接。 - slfan
@Prince 如果您阅读问题描述,您会发现其中有一部分写着“要查看上述错误,请参考m2e官方支持网站”,该网址指向您提到的URL。 - Konstantinos Margaritis
糟糕..我的错。真诚道歉! - Prince

0

我也遇到了同样的问题,我用以下方法解决: 在 "pom.xml" 中添加这些依赖项,然后重新加载 Maven。之后尝试运行你的代码。
` org.slf4j slf4j-nop 2.0.0-alpha5 test

    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>2.0.0-alpha5</version>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-simple</artifactId>
        <version>2.0.0-alpha5</version>
    </dependency>`

0
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-nop</artifactId>
        <version>2.0.0-alpha5</version>
        <scope>test</scope>
    </dependency>

    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>2.0.0-alpha5</version>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-simple</artifactId>
        <version>2.0.0-alpha5</version>
    </dependency>

1
目前你的回答不够清晰,请[编辑]以添加更多细节,帮助其他人理解它如何回答问题。你可以在帮助中心找到有关如何编写好答案的更多信息。 - Community

0

我在Eclipse Luna上运行Spring Boot - Gradle应用程序时遇到了类似的问题。通过手动在我的项目的.classpath中添加一个条目,我解决了这个问题。

<classpathentry sourcepath="C:/Users/<username>/.gradle/caches/modules-2/files-2.1/org.slf4j/slf4j-simple/1.7.7/3150039466ad03e6ef1c7ec1c2cbb0d96710cf64/slf4j-simple-1.7.7-sources.jar" kind="lib" path="C:/Users/<username>/.gradle/caches/modules-2/files-2.1/org.slf4j/slf4j-simple/1.7.7/8095d0b9f7e0a9cd79a663c740e0f8fb31d0e2c8/slf4j-simple-1.7.7.jar"/>

想法是要遵循this的解决方案。但如何实现取决于具体情况。修复的一种方式是我上面使用的方法。

希望这有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接