此错误表示您的代码或您在应用程序中使用的任何外部库都在使用SLF4J库 (一个开放源代码日志记录库),但无法找到所需的JAR文件,例如slf4j-api-1.7.2.jar因此它是在线程“ main” java.lang.NoClassDefFoundError: org/slf4j/LoggerFactory 。 如果查看该错误,将看到它无法找到类org/slf4j/LoggerFactoryrg.slf4j.LoggerFactory 。 软件包名称指示它是SLF4j的一部分,因此您需要在应用程序的类路径中使用SLF4j JAR文件,例如slf4j-api-1.7.2.jar。 因此,继续从SLFj网站或Maven Central存储库下载JAR文件,然后重新启动应用程序。

顺便说一句,SLF4j并不是真正的日志API,但它提供了对其他日志库(例如Log4j ,java.util.logging或LogBak)的抽象。 它与commons-logging库类似,但是由于设计更好,它在复杂的环境中不会混乱。

通过使用SLF4j,您可以切换到任何日志记录库,而无需更改应用程序中的任何代码行,例如,从java.util.logging or LogBack切换到Log4j。

因此,除了SLF4j二进制文件外,如果使用LogBack库,您还需要适当的日志记录二进制文件,例如log4j-1.2.16.jarlogback-1.2.3.jar 。 这些是SLF4j将调用它们进行实际工作的库。

有时,当您的代码不是真正使用SLF4j,而是使用内部使用它的工具或库时,会出现此错误。

例如,我使用的是log4jdbc.jar ,它是一个在运行JDBC代码时记录SQL语句及其计时的工具 ,它给了我这个错误:

Exception in thread "main" java.lang.NoClassDefFoundError: org/slf4j/LoggerFactory
at net.sf.log4jdbc.Slf4jSpyLogDelegator.<init>(Slf4jSpyLogDelegator.java:45)
at net.sf.log4jdbc.SpyLogFactory.<clinit>(SpyLogFactory.java:37)
at net.sf.log4jdbc.DriverSpy.<clinit>(DriverSpy.java:106)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:264)
at Testing.main(Testing.java:15)
Caused by: java.lang.ClassNotFoundException: org.slf4j.LoggerFactory
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 6 more

由于我的程序很简单,而且我实际上并没有使用任何Logging API,所以我对出现此错误的地方感到惊讶,但是,快速查看一下堆栈跟踪显示它
net.sf.log4jdbc.DriverSpy类,它使用SLF4j进行日志记录

稍后,当我阅读log4jdbc的文档时,我意识到我们需要SLF4J和Log4J JAR文件才能使其正常工作。 由于我在Eclipse中运行测试程序,因此对我来说很容易,因此我将slf4j-api-1.7.2.jarlog4j-1.2.16.jar放到了项目目录中。 由于它包含在classpath中,因此很容易被拾取。

顺便说一句,对于许多Java程序员来说, 类路径问题不容易解决,因为他们不知道将这个JAR文件确切地放在哪里来解决他们的问题。 由于每种应用程序的设置都不相同,因此我将尝试介绍一些方案来解决此错误。

1.如果您正在使用批处理脚本或Shell脚本运行Java程序,请查找-cp或-classpath选项,并查看它在哪里选择JAR文件。 您可以将slf4j-api-1.7.2.jarlog4j-1.2.16.jar放在这些目录中。

如果您的程序在Linux服务器上运行,则只需执行ps -ef | grep java并查看Java程序的JVM参数以查找类路径中的目录。 如果您有权访问脚本,则还可以将新目录添加到类路径。

 $ ps -ef | grep java

/opt/jre/v1.7.0_80-64bit/bin/java -Xmx8192M -Xms8192M -classpath /app/myapp.jar:/app/jackson.jar MyApplication

2.如果您的程序使用的是CLASSPATH环境变量,则只需回显$CLASSPATH并将slf4j-API-1.7.2.jarlog4j-1.2.16.jar文件放入CLASSPATH中已经存在的目录中,或者只需将新目录添加到CLASSPATH中即可。 请参阅本文以了解如何在CLASSPATH环境变量中进行更改

3.如果使用的是Eclipse,则只需将slf4j-API-1.7.2.jarlog4j-1.2.16.jar放入您的项目目录中。 默认情况下,它在类路径中,因此您的应用程序将提取JAR。

您可以从相应的网站(例如https://www.slf4j.orghttps://logging.apache.org/log4j/1.2/download)下载slf4j-api-1.7.2.jar和log4j-1.2.16.jar。 .html或仅从Maven Central存储库下载它们。

如果您使用Maven来构建项目和管理依赖关系,则还可以添加以下Maven依赖关系以将SLF4J和Log4j JAR文件下载到您的项目中:

<!-- SLF4J API -->

<dependency>

<groupId>org.slf4j</groupId>

<artifactId>slf4j-api</artifactId>

<version>1.7.2</version>

</dependency>

<!-- LOG4J -->

<dependency>

<groupId>org.slf4j</groupId>

<artifactId>slf4j-log4j12</artifactId>

<version>1.2.16</version>

</dependency>

添加这些依赖项之后,请确保从Maven进行了干净的构建,以实际从Maven的远程存储库下载这些依赖项。

这就是如何解决线程“ main”中的异常java.lang.NoClassDefFoundError:Java中的org / slf4j / LoggerFactory错误 。 您需要做的就是将slf4j-API-1.7.2.jar和log4j-1.2.16.jar文件添加到类路径中。

根据具体情况,版本可能有所不同,但是您必须添加兼容版本的SLF4J和所使用的日志记录库。 例如,如果您的应用程序使用LogBack,则需要添加logback.jar文件的相关版本。

如果使用Maven,还可以通过在pom.xml中添加相关的依赖项来下载这些JAR文件,否则,您可以从Maven Central或直接从SLF4j和Log4j网站下载JAR文件并添加到应用程序的类路径中。

如果您发现在将SLF4J和LOG4j JAR文件添加到类路径中时遇到任何麻烦,也可以在注释部分告诉我们,我们会尽力帮助您。

感谢您阅读本教程,如果您喜欢本教程,请与您的朋友和同事分享。 如果您有任何问题或建议,请发表评论。

翻译自: https://www.javacodegeeks.com/2018/02/fix-exception-thread-main-java-lang-noclassdeffounderror-org-slf4j-loggerfactory-java.html

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐