如何在线程“ main”中修复异常java.lang.NoClassDefFoundError:Java中的org / slf4j / LoggerFactory...

此错误表示您的代码或您在应用程序中使用的任何外部库都在使用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放在了项目目录中。 由于它包含在类路径中,因此很容易被拾取。

顺便说一句,对于许多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.org和https://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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/348000.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

sin查找表 matlab,利用Xilinx中的ROM构造查找表来计算sin和cos的方法探讨

1.使用matlab制作.coe文件查找表的构造构造256点的正余弦表exp(-j*2*pi*(0:255)/256)&#xff0c;分别得到 cos和sin的查找表matlab代码: 求sinfid fopen(sin.txt,a );str1 MEMORY_INITIALIZATION_RADIX10;;str2 MEMORY_INITIALIZATION_VECTOR;fprintf(fid,\t%s\n \t%s\n, s…

lucene使用3.0.3_使用Apache Lucene 4.3轻松进行搜索

lucene使用3.0.3Lucene是用Java编写的全文搜索引擎&#xff0c;可以为任何应用程序提供强大的搜索功能。 Lucene的核心是基于文件的全文本索引。 Lucene提供API创建该索引&#xff0c;然后向该索引添加和删除内容。 此外&#xff0c;它允许使用功能强大的搜索算法从该索引中搜索…

Java124 0,AcWing 124. 数的进制转换java

package acwing寒假每日一题;import java.io.BufferedInputStream;import java.util.*;public class TransNumber {public static void main(String[] args) {Scanner in new Scanner(new BufferedInputStream(System.in));//n次操作int n in.nextInt();//输入字符串&#xf…

php提取pdf首页图片,pdf图片怎么提取

pdf图片的提取方法&#xff1a;首先用极速PDF阅读器打开文档&#xff1b;然后在图片处单击鼠标右键并选择“复制图片”&#xff0c;这时就可以粘贴发送了。本文操作环境&#xff1a;Windows7系统&#xff0c;Microsoft Office PowerPoint2020版本&#xff0c;Dell G3电脑。pdf图…

dlopen linux 实例_Linux静态库和动态库

库从本质上来说是一种可执行代码的二进制格式&#xff0c;可以被载入内存中执行。库分静态库和动态库两种。 静态库和动态库的区别1. 静态函数库这类库的名字一般是libxxx.a&#xff1b;利用静态函数库编译成的文件比较大&#xff0c;因为整个 函数库的所有数据都会被整合进目标…

Neo4j:Cypher – Neo.ClientError.Statement.TypeError:不知道如何添加Double和String

我最近将支持Neo4j的应用程序从Neo4j 3.2升级到Neo4j 3.3&#xff0c;发现围绕类型强制的行为发生了有趣的变化&#xff0c;导致我的应用程序抛出了很多错误。 在Neo4j 3.2和更早版本中&#xff0c;如果将String添加到Double&#xff0c;它将把Double强制转换为String并连接值…

php7 php5.6 array,[转]php5.6 升级到php7及变化

不向后兼容的变更错误和异常处理相关的变更在 PHP 7 中&#xff0c;很多致命错误以及可恢复的致命错误&#xff0c;都被转换为异常来处理了。 这些异常继承自 Error 类&#xff0c;此类实现了 Throwable 接口 (所有异常都实现了这个基础接口)。这也意味着&#xff0c;当发生错误…

python 在末尾增加一个字符串,python - Python File.write在末尾添加额外的字符串 - SO中文参考 - www.soinside.com...

我正在使用python(3.6)更新文本文件&#xff0c;并打开r with open(f.play, r) as f2:play f2.read()result manipulate(play)print(result)f2.seek(0, 0)f2.write(result)通过这样做&#xff0c;我得到了意外的结尾部分ap:Envelope>当然&#xff0c;多余的部分是在第一次…

反射setaccessible_advancedday16类加载器,反射

加载配置文件在src目录下创建一个config.properties配置文件&#xff0c;使用类加载器加载配置文件。//创建集合Properties propertiesnew Properties();//获取src目录下&#xff0c;配置文件的流InputStream in ClassLoader.getSystemClassLoader() .getResourceAsStream(…

eventbus多个订阅_番石榴的EventBus –简单的发布者/订阅者

eventbus多个订阅在查看Google的Guava库版本10的最新添加内容时&#xff0c;我注意到EventBus的添加。 这是发布-订阅样式消息传递系统的轻量级实现。 这类似于JMS提供的发布-订阅模型&#xff0c;但是消息保留在应用程序内&#xff0c;而不是在外部广播。 EventBus允许您在程…

python 字段升序,python 根据两个字段排序, 一个升序, 一个降序

SSL双向认证java实现&lpar;转&rpar;本文通过模拟场景,介绍SSL双向认证的java实现 默认的情况下,我认为读者已经对SSL原理有一定的了解,所以文章中对SSL的原理,不做详细的介绍. 如果有这个需要,那么通过GOOGLE,可以搜索到很 ...List和Tuple类型list列表,list是一种有序的…

元气骑士如何获得机器人成就皮肤_元气骑士:机器人成就皮肤该怎么获得?百场老机器人教你走位...

【元气骑士我最行&#xff0c;不爱红武爱老云】各位亲爱的读者大家好&#xff0c;我是百场老机器老云。自从《元气骑士》更新出了特典皮肤之后&#xff0c;众多玩家开始了自己的成就之旅。有很多老玩家能够轻松完成这些成就&#xff0c;但是对于不少接触这款游戏不久的玩家来说…

Elasticsearch –使用模式替换过滤器和自定义分析器忽略查询中的特殊字符

使用Elasticsearch 5&#xff0c;我们有一个字段&#xff0c;例如驾驶执照编号&#xff0c;其中的值可能包含特殊字符&#xff0c;并且由于用户在有限的验证范围内输入了值&#xff0c;因此值的大小写不一致。 例如&#xff0c;这些是假设值&#xff1a; CA-123-456-789 WI.1…

python代码编程软件_编程与编程软件(python-pycharm)

课程安排编辑语言之python数据库软件之mysql今日内容概要编程与编程语言计算机存储内部工作原理编程语言的发展史解释型语言与编译型语言python解释器版本及下载安装编写python程序的编辑器(提升编码效率)变量的概念变量名的命名规范变量名的书写风格今日内容详细编程与编程语言…

基于matlab的语音信号,科学网—[转载]【信息技术】【2014.06】【含源码】基于MATLAB的语音信号处理与分析 - 刘春静的博文...

本文为瑞典耶夫勒大学(作者&#xff1a;Nan Wu)的学士论文&#xff0c;共48页。语音传递是人类最重要、最有效、最常用的信息交流方式。语言是人类特有的特征&#xff0c;而人声是常用的工具&#xff0c;也是相互传递信息的重要途径。语音具有较大的信息容量。因此&#xff0c;…

mysql 插入加锁_Mysql加锁过程详解(9)-innodb下的记录锁,间隙锁,next-key锁

你需要知道的之前我们介绍了排他锁&#xff0c;其实innodb下的记录锁(也叫行锁)&#xff0c;间隙锁&#xff0c;next-key锁统统属于排他锁。行锁记录锁其实很好理解&#xff0c;对表中的记录加锁&#xff0c;叫做记录锁&#xff0c;简称行锁。生活中的间隙锁编程的思想源于生活…

string.intern_使用String.intern()减少内存使用

string.intern时不时地会有一个垂死的生产应用程序。 而且您知道您需要尽快对其进行修补。 我们也是如此&#xff0c;并认为分享最近的一个战争故事会很有趣。 在这种情况下&#xff0c;我们就有机会使用String.intern&#xff08;&#xff09;之类的简单补丁来修补应用程序。 …

测量string变量长度函数_利用Graphics::MeasureString函数测量字符串的宽度,高度

我就吐一句槽&#xff0c;今天被这个函数完虐....当我们需要获得一个字符串的长度时(注意&#xff0c;不是length&#xff0c;这只是返回该字符串的字符个数)&#xff0c;我们需要知道的是一个字符串的长度也就是一个字符串的宽&#xff0c;说到底就是像素大小&#xff0c;没错…

首选System.lineSeparator()以用Java编写系统相关的行分隔符字符串

JDK 7在java.lang.System类上引入了一个名为lineSeparator&#xff08;&#xff09;的新方法。 该方法不期待任何参数&#xff0c;并返回一个String &#xff0c;它表示“取决于系统的行分隔符字符串。” 此方法的Javadoc文档还指出System.lineSeparator() “始终返回相同的值–…

微信批量退款php,微信支付退款接口详解

微信支付有2个退款相关的接口&#xff0c;分别是申请退款API和查询退款API&#xff0c;这2个接口在实际微信支付开发中都会用到。其中申请退款API因为安全性&#xff0c;需要使用证书&#xff0c;证书在商户平台后台下载.申请退款接口支持一年以内的订单退款&#xff0c;可以分…