SLF4J:无法加载类“org.slf4j.impl.StaticLoggerBinder”
Posted
技术标签:
【中文标题】SLF4J:无法加载类“org.slf4j.impl.StaticLoggerBinder”【英文标题】:SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder" 【发布时间】:2011-11-17 07:23:49 【问题描述】:我的应用程序将同时部署在 tcServer 和 WebSphere 6.1 上。此应用程序使用 ehCache,因此需要 slf4j 作为依赖项。 结果,我将 slf4j-api.jar (1.6) jar 添加到我的 war 文件包中。
应用程序在 tcServer 中运行良好,但出现以下错误:
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.
但是,当我在 WebSphere 中部署时,我得到一个 java.lang.NoClassDefFoundError: org.slf4j.impl.StaticLoggerBinder
。
还配上Failed to load class "org.slf4j.impl.StaticMDCBinder"
我检查了两个应用服务器的类路径,没有其他 slf4j jar。
有人知道这里可能发生什么吗?
【问题讨论】:
这个article解决了我的问题 我已经在这里回答了这个问题。 ***.com/a/66954369/13898185 【参考方案1】:我在使用 WebSphere 6.1 时遇到了同样的问题。正如 Ceki 所指出的,WebSphere 正在使用大量的 jar,其中一个指向旧版本的 slf4j。
No-Op 回退只发生在 slf4j -1.6+ 上,所以任何比这更早的东西都会引发异常并停止您的部署。
SLf4J site 中有一个文档可以解决这个问题。我遵循了这一点,并将slf4j-simple-1.6.1.jar
和我已经拥有的slf4j-api-1.6.1.jar
添加到了我的应用程序中。
如果你使用 Maven,添加以下依赖,$slf4j.version
为 the latest version of slf4j
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>$slf4j.version</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>$slf4j.version</version>
</dependency>
这解决了我的问题。希望对遇到此问题的其他人有所帮助。
【讨论】:
是的,这里也提到了错误 - slf4j.org/manual.html 但我现在收到一个新错误 - 原因:java.lang.ClassNotFoundException: org.apache.commons.logging.LogFactory “正如 Ceki 所指出的,WebSphere 正在使用大量的 jar,其中一个指向旧版本的 slf4j。” - Maven 照顾依赖关系就这么多!开什么玩笑。 你好 MAVEN 用户:mvnrepository.com/artifact/org.slf4j/slf4j-simple/1.6.2 我使用的是 1.7 并且有同样的问题。我添加了 slf4j-simple-1.7.jar,现在问题解决了。 我的评论不值得自己回答,但请确保范围不只是设置为测试。 (这是给那些从谷歌搜索而来的人。
如果你使用 maven,只需添加以下内容
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.5</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.5</version>
</dependency>
或者
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.5</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.6.4</version>
</dependency>
【讨论】:
slf4j-simple
与slf4j-api
不是同一个版本有什么原因吗?他们可能会很好地协同工作,但我认为让他们使用相同的版本通常更安全,也是更好的做法。此外,如果您需要启用仅控制台日志记录,例如,在运行单元测试时,那么 slf4j-simple
似乎就足够了(不过对我来说)。
AFAIK 你应该只有 1 个 slf4j 的 impl,即 slf4j-log4j12 或 slf4j-simple,而不是两者。
@Igor KatKov 这仅适用于本地机器,但在 Jenkins 上遇到相同的错误,不确定出了什么问题。你能澄清一下吗
slf4j-api 需要配置,当您第一次运行它时不可用(并且没有编辑任何配置文件)。使用 slf4j-simple 将允许您使用基本 Logger,而无需配置任何文件,但所见即所得。一旦你学会了配置文件和定制你喜欢的 Logger 输出,你就可以回到 slf4j-api。 (仍在学习哪里有以及如何自己编辑)
第二个依赖项对我有用。第一个创建了另一个警告 WARN No appenders could be found for logger (org.semanticweb.owlapi.utilities.Injector)。【参考方案3】:
只需将其添加到您的 pom.xml:
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.7.21</version>
</dependency>
【讨论】:
该解决方案对我有用;值得指出的是文档(我发现错误解释的地方):slf4j.org/codes.html#StaticLoggerBinder 没有别的了,但在运行一个简单的 kafka 生产者示例时,这对我有用。非常感谢! @WitoldKaczurba 是对的。我在使用 maven 使用依赖项时遇到了同样的问题。我只是用谷歌搜索并转到slf4j.org/codes.html#StaticLoggerBinder,其中说明了问题及其解决方案。我使用的是 slf4j-api 版本 1.7.25。在检查了上述链接的文档后,我只使用了<groupId>org.slf4j</groupId> <artifactId>slf4j-simple</artifactId> <version>1.7.25</version> </dependency>
并解决了问题这里有不少答案建议将 slf4j-simple 依赖项添加到您的 maven pom 文件中。您可能需要检查最新版本。
https://mvnrepository.com/artifact/org.slf4j/slf4j-simple 您将找到最新版本的 SLF4J 简单绑定。选择最适合您的版本(2021-07 的 1.7.32 仍然是 2021-10 的稳定版本)并将其包含到您的 pom.xml 中。
为方便起见,此处显示了一些依赖项 - 但当您阅读本文时,它们可能不是最新的!
2021-08 Alpha 版
<!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-simple -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>2.0.0-alpha5</version>
</dependency>
2019 年 2 月测试版
<!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-simple -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.8.0-beta4</version>
</dependency>
稳定版 2021-07
<!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-simple -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.7.32</version>
</dependency>
感谢下面的评论,我删除了范围测试部分。
【讨论】:
你为什么使用<scope>test</scope>
?以我的经验,我至少需要runtime
范围来确保slf4j-simple
在类路径上。很好奇你是如何只使用test
作用域...
感谢您指出这一点。我相应地从我的答案中删除了范围标签。这是一个剪切和粘贴问题 - 我提供的链接以这种方式提供了 beta 依赖项。【参考方案5】:
您需要在类路径中添加以下 jar 文件:slf4j-simple-1.6.2.jar
。如果没有,请下载。请参考http://www.slf4j.org/codes.html#multiple_bindings
【讨论】:
【参考方案6】:有时我们应该会看到来自警告SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
的注释。
当在类路径上找不到合适的 SLF4J 绑定时会发生这种情况
您可以搜索出现此警告的原因。
将*slf4j-nop.jar
、slf4j-simple.jar
、slf4j-log4j12.jar
、slf4j-jdk14.jar
或logback-classic.jar*
中的 jar 之一添加到类路径应该可以解决问题。
compile "org.slf4j:slf4j-simple:1.6.1"
例如将上述代码添加到您的build.gradle
或将相应代码添加到pom.xml
用于maven 项目。
【讨论】:
【参考方案7】:我遇到了同样的错误。我在本地开发中配置了 slf4j-api、slf4j-log4j12 和 log4j。所有配置都很好,但是我从 mvnrepository 复制的 slf4j-log4j12 依赖项具有测试范围 <scope>test</scope>
。当我删除它时,一切都很好。
有时愚蠢的错误会让我们头疼;)
【讨论】:
【参考方案8】:将文件slf4j-log4j12-1.6.4.jar
放在类路径中就可以了。
【讨论】:
或将依赖项添加到您的 pomSLF4j 是各种日志框架的抽象。因此,除了拥有 slf4j 之外,您还需要在类路径中包含任何日志框架,例如 log4j 或 logback(等)。 有一个想法请参考http://logback.qos.ch/manual/introduction.html中的First Baby Step
【讨论】:
添加 logback 为我解决了这个问题。我将最新的 logback 经典放入 pom (1.1.7) 并失败,因为 slf4j 依赖项太旧 (1.6.2)。将 logback 降级到 1.0.0 并将 slf4j 保留在 1.6.x 有效,将 slf4j 升级到 1.7.20 并将 logback 保留在 1.1.7 也是如此。【参考方案10】:如果你使用 maven 进行依赖管理,那么你可以在 pom.xml 中添加以下依赖
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.5.6</version>
</dependency>
对于非 Maven 用户 只需下载该库并将其放入您的项目类路径中。
这里可以查看详情:http://www.mkyong.com/wicket/java-lang-classnotfoundexception-org-slf4j-impl-staticloggerbinder/
【讨论】:
对于 maven 用户我发现我需要在 pom.xml 中添加以下内容,这也会自动引入 logback-core:This is not an error. This message tells you that you do not have any logger implementation (such as e.g. Logback) added in classpath, and therefore NOP (No Operation) log
Look for sarxos comment @Paul 提到的需要添加 logback-classic。从<artifactId>slf4j-api</artifactId>
更改为<artifactId>slf4j-simple</artifactId>
的另一种方法也可以。图为here【参考方案11】:
当我收到以下错误时,我遇到了这个问题:
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.
当我在我的libs
中使用slf4j-api-1.7.5.jar
时。
尽管我尝试了整个建议的补充 jar,例如 slf4j-log4j12-1.7.5.jar
、slf4j-simple-1.7.5
,但错误消息仍然存在。当我将slf4j-jdk14-1.7.5.jar
添加到 java 库时,问题终于解决了。
在http://www.slf4j.org/download.html获取整个 slf4j 包
【讨论】:
【参考方案12】: <dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.7.21</version>
</dependency>
将上述依赖放入 pom.xml 文件中
【讨论】:
但记得查看最新版本。【参考方案13】:Slf4j 是 log4j、logback、java.util.logging 等底层日志框架的外观。
为了与底层框架连接,slf4j 使用绑定。
log4j - slf4j-log4j12-1.7.21.jar java.util.logging - slf4j-jdk14-1.7.21.jar 等如果缺少绑定jar,则会抛出上述错误。您可以下载此 jar 并将其添加到类路径中。
对于maven依赖,
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.21</version>
</dependency>
这个依赖除了 slf4j-log4j12-1.7.21.jar 之外,它还会把 slf4j-api-1.7.21.jar 和 log4j-1.2.17.jar 拉到你的项目中
参考:http://www.slf4j.org/manual.html
【讨论】:
【参考方案14】:请将以下依赖项添加到 pom 以解决此问题。
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.7.25</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.25</version>
</dependency>
【讨论】:
我刚刚包含了第一个依赖项 - 正如另一个答案中所指出的那样 - 它可以工作。这两个依赖项都不能解决我的问题。 并且想使用本地maven而不是Intellij的Bundled maven。【参考方案15】:我在使用 Java 9 库的 Spring-boot-2 应用程序中遇到了类似的问题。
在我的 pom.xml 中添加以下依赖项为我解决了这个问题:
<dependency>
<groupId>com.googlecode.slf4j-maven-plugin-log</groupId>
<artifactId>slf4j-maven-plugin-log</artifactId>
<version>1.0.0</version>
</dependency>
【讨论】:
【参考方案16】:作为 jar 包含和纯 maven 解决方案的替代方案,您可以将 from maven 包含在 gradle 中。
1.7.25
版本示例
// https://mvnrepository.com/artifact/org.slf4j/slf4j-simple
api group: 'org.slf4j', name: 'slf4j-simple', version: '1.7.25'
把它放在你的 build.gradle
文件的依赖中。
【讨论】:
【参考方案17】:在 Websphere 案例中,您使用的是 slf4j-api.jar 的旧版本,即 1.4.x。或 1.5.x 躺在某个地方。您在 tcServer 上观察到的行为,即故障转移到 NOP,发生在 slf4j 版本 1.6.0 及更高版本上。确保您在所有平台上都使用 slf4j-api-1.6.x.jar,并且没有将旧版本的 slf4j-api 放在类路径中。
【讨论】:
谢谢,我检查了我的 WebSphere 6.1 类路径,但没有看到任何其他版本的 slf4j,例如我在我的 WebSphere 文件系统上搜索了 slf4jjar,但只返回了 1.6 版本。你知道 WebSphere 是否与 slf4j 一起打包? 一切皆有可能,但如果 WebSphere 与 slf4j-api 捆绑在一起,我会感到非常惊讶。焊接捆绑 slf4j-api.jar。你在使用焊接吗?【参考方案18】:我正在从事一个项目 Struts2+Spring。所以它需要一个依赖slf4j-api-1.7.5.jar
。
如果我运行该项目,我会收到类似的错误
加载类“org.slf4j.impl.StaticLoggerBinder”失败
我通过添加 slf4j-log4j12-1.7.5.jar
解决了我的问题。
所以在你的项目中添加这个 jar 来解决这个问题。
【讨论】:
【参考方案19】:正如SLF4J Manual 状态
Java 的简单日志外观 (SLF4J) 用作简单外观 或各种日志框架的抽象,例如 java.util.logging、logback 和 log4j。
和
一旦您将绑定添加到类路径,该警告就会消失。
所以你应该选择你想要使用的绑定。
NoOp 绑定 (slf4j-nop)
绑定 NOP,静默丢弃所有日志记录。
在https://search.maven.org/search?q=g:org.slf4j%20AND%20a:slf4j-nop&core=gav查看新版本
简单绑定(slf4j-simple)
将所有事件输出到 System.err。只打印级别 INFO 和更高级别的消息。此绑定在小型应用程序的上下文中可能很有用。
在https://search.maven.org/search?q=g:org.slf4j%20AND%20a:slf4j-simple&core=gav查看新版本
日志框架的绑定(java.util.logging、logback、log4j)
如果要将日志写入文件,则需要这些绑定之一。
在https://www.slf4j.org/manual.html#projectDep查看描述和说明
我的看法
我会推荐 Logback,因为它是 log4j 项目的继承者。
在https://search.maven.org/search?q=g:ch.qos.logback%20AND%20a:logback-classic&core=gav查看最新版本的绑定
您可以获得开箱即用的控制台输出,但如果您需要将日志写入文件,只需将 FileAppender
配置放入 src/main/resources/logback.xml
或 src/test/resources/logback-test.xml
,如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<!-- encoders are assigned the type
ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
<encoder>
<pattern>%dHH:mm:ss.SSS [%thread] %-5level %logger36 - %msg%n</pattern>
</encoder>
</appender>
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
<file>logs/logs.log</file>
<encoder>
<pattern>%date %level [%thread] %logger10 - %msg%n</pattern>
</encoder>
</appender>
<root level="debug">
<appender-ref ref="STDOUT" />
<appender-ref ref="FILE" />
</root>
<logger level="DEBUG" name="com.myapp"/>
</configuration>
(详见说明书:https://logback.qos.ch/manual/configuration.html)
【讨论】:
【参考方案20】:这可以使用相同的版本解决。我试过了,解决了
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.5</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.5</version>
</dependency>
【讨论】:
【参考方案21】:我添加了这个依赖来解决这个问题:
https://mvnrepository.com/artifact/org.slf4j/slf4j-simple/1.7.25
【讨论】:
【参考方案22】:在 payara 5.191 上遇到了同样的问题
jcl-over-slf4j 和 slf4j-log4j12 一起解决了这个问题
<properties>
<slf4j.version>1.7.29</slf4j.version>
</properties>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>$slf4j.version</version>
<type>jar</type>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jcl-over-slf4j</artifactId>
<version>$slf4j.version</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>$slf4j.version</version>
</dependency>
【讨论】:
这不起作用。【参考方案23】:根据SLF4J官方文档
未能加载类 org.slf4j.impl.StaticLoggerBinder
当 org.slf4j.impl.StaticLoggerBinder 类无法加载到 记忆。当找不到合适的 SLF4J 绑定时会发生这种情况 在类路径上。 放置一个(并且只有一个) slf4j-nop.jar, slf4j-simple.jar、slf4j-log4j12.jar、slf4j-jdk14.jar 或 类路径上的 logback-classic.jar 应该可以解决问题。
只需将this jar 和 slf4j api.jar 添加到您的类路径即可完成任务。 祝你好运
【讨论】:
【参考方案24】:我解决它添加这个库:slf4j-simple-1.7.25.jar 可以在官网下载这个https://www.slf4j.org/download.html
【讨论】:
【参考方案25】:这是我的 5 美分...
我在运行测试时遇到了同样的问题。因此,我只为测试运行时添加了一个实现来修复它。我正在为这个项目使用 gradle。
//https://mvnrepository.com/artifact/ch.qos.logback/logback-classic
testRuntimeOnly 组:'ch.qos.logback',名称:'logback-classic', 版本:'1.2.3'
【讨论】:
【参考方案26】:对我来说,问题是: 使用 Hibernate,我看到它已经使用了 slf4j,并且它已经在我的类路径中,所以我决定使用它。 下一步-为slf4j添加imlementor,所以我添加到maven:
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-jdk14</artifactId>
<version>1.7.25</version>
</dependency>
但它因错误而失败! SLF4J:无法加载类“org.slf4j.impl.StaticLoggerBinder”
解决方案是: Hibernate对slf4j的依赖是版本1.7.26,我添加了次要版本依赖1.7.25。所以当我解决这个问题时 - 一切都好了
【讨论】:
【参考方案27】:我知道这篇文章有点老了,但万一其他人遇到这个问题:
将 slf4j-jdk14-X.X.X.jar 添加到您的 CLASSPATH(其中 X.X.X 是版本号 - 例如 slf4j-jdk14-1.7.5.jar)。
HTH 彼得
【讨论】:
您是否建议用户恢复到 JDK1.4 日志记录以解决类路径问题?另请查看此常见问题解答条目:slf4j.org/faq.html#need_to_recompile【参考方案28】:我使用 Jena 并在 pom.xml 中添加伙伴依赖
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.0.13</version>
</dependency>
我尝试添加 slf4j-simple,但它只是消失了“SLF4J: Failed to load class “org.slf4j.impl.StaticLoggerBinder””错误,但 logback-classic 显示更多详细信息。
official document
【讨论】:
【参考方案29】:解决方案在他们的官方网站上有说明:
加载类 org.slf4j.impl.StaticLoggerBinder 失败
当 org.slf4j.impl.StaticLoggerBinder 类无法加载到 记忆。当找不到合适的 SLF4J 绑定时会发生这种情况 在类路径上。放置一个(也是唯一一个)slf4j-nop.jar slf4j-simple.jar、slf4j-log4j12.jar、slf4j-jdk14.jar 或 类路径上的 logback-classic.jar 应该可以解决问题。自从 1.6.0 从 SLF4J 版本 1.6 开始,在没有绑定的情况下,SLF4J 将默认为无操作 (NOP) 记录器实现。如果你是 负责打包一个应用,不关心 记录,然后将 slf4j-nop.jar 放在你的类路径上 应用程序将摆脱此警告消息。注意嵌入 库或框架等组件不应声明 依赖于任何 SLF4J 绑定,但仅依赖于 slf4j-api。当一个 library 声明了对 SLF4J 绑定的编译时依赖,它 将这种绑定强加给最终用户,从而否定了 SLF4J 的目的。
解决方案:我已经使用 maven 对 intellij 的研究添加到我的项目中,并且我选择了 slf4j-jdk14.jar。
【讨论】:
【参考方案30】:您的问题很可能是因为<scope>test</scope>
(在某些情况下也是<scope>provided</scope>
),如@thangaraj 所述。
Documentation 说:
这个范围表示正常不需要依赖 应用程序的使用,并且仅可用于测试编译 和执行阶段。 Test dependencies aren’t transitive and are only present for test and execution classpaths.
因此,如果您不需要依赖项来进行测试,那么您可以使用而不是(您将在 mvnrepository 中看到的内容):
<!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-nop -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-nop</artifactId>
<version>1.7.24</version>
<scope>test</scope>
</dependency>
没有任何作用域(默认为编译作用域,当没有提供其他作用域时):
<!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-nop -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-nop</artifactId>
<version>1.7.25</version>
</dependency>
这与:
<!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-nop -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-nop</artifactId>
<version>1.7.25</version>
<scope>compile</scope>
</dependency>
【讨论】:
以上是关于SLF4J:无法加载类“org.slf4j.impl.StaticLoggerBinder”的主要内容,如果未能解决你的问题,请参考以下文章
无法加载类“org.slf4j.impl.StaticLoggerBinder”错误
休眠异常无法加载类“org.slf4j.impl.StaticLoggerBinder”
Play/Scala 2.5 SLF4J:无法加载类“org.slf4j.impl.StaticLoggerBinder”