如何在线程“ 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/LoggerFactory或rg.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.jar或logback-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.jar和log4j-1.2.16.jar放在了項目目錄中。 由于它包含在類路徑中,因此很容易被拾取。
順便說一句,對于許多Java程序員來說, 類路徑問題不容易解決,因為他們不知道將這個JAR文件確切地放在哪里來解決他們的問題。 由于每種應用程序的設置都不相同,因此我將嘗試介紹一些方案來解決此錯誤。
1.如果您正在使用批處理腳本或Shell腳本運行Java程序,請查找-cp或-classpath選項,并查看它在哪里選擇JAR文件。 您可以將slf4j-api-1.7.2.jar和log4j-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 MyApplication2.如果您的程序使用的是CLASSPATH環境變量,則只需回顯$CLASSPATH并將slf4j-API-1.7.2.jar和log4j-1.2.16.jar文件放入CLASSPATH中已經存在的目錄中,或者只需將新目錄添加到CLASSPATH中即可。 請參閱本文以了解如何在CLASSPATH環境變量中進行更改 。
3.如果使用的是Eclipse,則只需將slf4j-API-1.7.2.jar和log4j-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
總結
以上是生活随笔為你收集整理的如何在线程“ main”中修复异常java.lang.NoClassDefFoundError:Java中的org / slf4j / LoggerFactory...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java 解析gson_使用Java和G
- 下一篇: ejb 示例 2018_Java EE