Eclipse中调试gradle项目出现错误:SLF4J: Failed to load class “org.slf4j.impl.StaticLoggerBinder“.

文章目录

    • 前言
    • 1 错误场景
    • 2 解决方案
      • 2.1 观察、思考
      • 2.2 更新slf4j-api版本
    • 小结

前言

如题。本文旨在解决该错误。备注:SLF4J: Failed to load class “org.slf4j.impl.StaticLoggerBinder“这样的错误已经有很多参考文章了,但是竟然没有一篇文章能够解决我遇到的问题,我研究了许久,才找到解决方案。因此在此记录,以期给遇到同样问题的读者提供一个可行方案。

1 错误场景

  • Gradle项目已经导入到Eclipse中。
  • 运行main函数。然后报错如下:

SLF4J: Failed to load class “org.slf4j.impl.StaticLoggerBinder”.
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
Exception in thread “main” java.lang.NoClassDefFoundError: org/slf4j/impl/StaticLoggerBinder

  • 这个gradle项目的build.gradle文件大概如下:

dependencies {
    compile 'org.apache.thrift:libthrift:0.9.1'
    compile group: 'org.apache.commons', name: 'commons-lang3', version:'3.1'
    compile group: 'com.google.guava', name: 'guava', version: '18.0'
    compile group: 'joda-time', name: 'joda-time', version: '2.3'
    compile group: 'log4j', name: 'log4j', version: '1.2.17'
    compile group: 'commons-io', name: 'commons-io', version: '2.4'
    testCompile group: 'junit', name: 'junit', version: '4.11'
}

网上的解决方案都不太顶用。我也做了非常多的尝试:

  • 1)在build.gradle中各种添加slf4j、log4j相关(什么slf4j-api,slf4j-simple,log4j12 等等)的包,没用哇;
  • 2)尝试gradle run在命令行运行,也是同样报错;
  • 3)还有各种尝试,已经记不清了,总之非常折磨。

下面介绍解决方案。

2 解决方案

2.1 观察、思考

首先,这样的错误报出来,问题肯定出在log4j和sl4j相关的包上。

但是我看build.gradle文件中只有一个依赖:
compile group: 'log4j', name: 'log4j', version: '1.2.17'
没有任何其他的sl4j包,这就奇怪了,难道是默认下载对应的sl4j依赖吗?

我又观察了一下Eclipse左侧的dependencies栏目,如图:
Eclipse中调试gradle项目出现错误:SLF4J: Failed to load class “org.slf4j.impl.StaticLoggerBinder“._第1张图片

可以发现,这里竟然有一个slf4j-api-1.5.8版本的包!!!

我大概已经感觉到了问题原因可能在这个包太老旧了。需要换新版本。

2.2 更新slf4j-api版本

1)先移除旧版本,右键项目->build path -> configure build path 即进入如下界面,移除这个旧版本的slf4j-api:
Eclipse中调试gradle项目出现错误:SLF4J: Failed to load class “org.slf4j.impl.StaticLoggerBinder“._第2张图片
2)添加新版本:

先在build.gradle中添加依赖:
compile group: 'org.slf4j', name: 'slf4j-api', version: '1.7.26'

然后编译:./gradle build 或者./gradlew build

然后还要在Eclipse中手动导入这个依赖!!!这一步不能忘,否则在Eclipse中还是回报错

同样地,右键项目->build path -> configure build path 即进入如下界面,添加这个新版本的slf4j-api,如图:
Eclipse中调试gradle项目出现错误:SLF4J: Failed to load class “org.slf4j.impl.StaticLoggerBinder“._第3张图片

同理,用同样的方法,还要在build.gradle加上一个额外的依赖:
compile group: 'org.slf4j', name: 'slf4j-log4j12', version: '1.7.26'

然后用gradle编译,然后也是在Eclipse中导入这个依赖。

最后的结果:
顺利运行,再无此错误。

小结

这个问题本质上是需要添加两个额外依赖:

compile group: 'org.slf4j', name: 'slf4j-api', version: '1.7.26'
compile group: 'org.slf4j', name: 'slf4j-log4j12', version: '1.7.26'

但是过程曲折,还是一言难尽。
事情的转机在:我去搜索了org.slf4j.impl.StaticLoggerBinder 这个类到底在哪个版本的包里面,然后我发现好像在StaticLoggerBinder (SLF4J 1.8.0-alpha2 API) 这里,所以我把slf4j-api更新到了1.8.0-alpha2,然而还是报错,不过这次错误变了:SLF4J: No SLF4J providers were found.

然后我参考:(笔记)SLF4J: No SLF4J providers were found.解决方法,结合 https://mvnrepository.com/artifact/org.slf4j/slf4j-log4j12/1.7.26 这里说的slf4j-log4j12 的依赖项有log4jslf4j-api,把依赖换成了1.7.26版本。
并且还加上了slf4j-log4j12,这时候错误就没有了。

可谓是误打误撞,歪打正着?

总之花了几个小时,所以在此记录一下。

你可能感兴趣的:(PHDcand2-1)