解決 java.lang.UnsatisfiedLinkError:no ** in java.library.path in java.library.path 的異常


報錯截圖

大致的意思是說jvm在加載項目依賴時,找不到××這樣一個library,導致該線程出現異常:

Exception in thread "main" java.lang.UnsatisfiedLinkError: no ddlogapi in java.library.path

原因分析

當java應用需要用到本地類庫(例如windows下的.DLL文件,或者Linux下的.SO文件),可能會出現上面的異常。一般來說,jvm在運行時加載本地libraries時,要么從PATH環境變量,要么根據java.library.path system property指定的位置加載,這取決於java程序中使用的是System.load()還是java.lang.System.loadLibrary()

如果java因為任何原因而沒有找到,就會跑出java.lang.UnsatisfiedLinkError: no dll in java.library.path的異常。通常,我們可以從報錯信息中獲得類加載的方式(System.load() or System.loadLibrary() )。

解決辦法

由於錯誤明確表明Java無法找到所需的某些本機庫,這可能意味着該庫不存在,或者Java由於錯誤的PATH或java.library.path而無法找到它們。請記住,當不提供此系統屬性時,默認情況下,Java會在Windows操作系統中查看本機庫的PATH,而在Linux中會查看LD_LIBRARY_PATH。盡管提供此PATH並使用System.loadLibrary()方法為所有平台上的本地類庫提供一致的位置是一種很好的做法。

可以執行以下幾項操作來解決錯誤 java.lang.UnsatisfiedLinkError:no ×× in java.library.path

  1. 檢查Java的PATH,是否包含必需的dll。

  2. 如果已為所需的dll設置了java.library.path,請對其進行驗證。

  3. 使用以下命令運行Java應用程序:java -Djava.library.path= "your dll path"

  4. 嘗試指定庫的基本名稱,並使用System.loadLibaray("name") 加載庫,該名稱不包含dll。

  5. Linux從LD_LIBRARY_PATH加載動態鏈接的庫(.so),因此您可能希望將共享庫目錄包含在LD_LIBRARY_PATH中,例如export LD_LIBRARY_PATH=/shared library (.so)

  6. 通過使用System.load("Path of native library")方法提供 C:/WINNT/system32/digest.dll 這樣的絕對路徑來加載庫。

補充

如果仍然產生相同的異常,即使將jar添加到classpath、把本地的類庫加入到PATH環境變量中、提供系統屬性java.library.path去指向本地類庫的位置,那么肯定是你的PATH變量沒有設置正確,請仔細檢查。

使用IDEA加載動態鏈接庫.so文件(Linux)

  • Project Structure(Ctrl+Alt+Shift+S) > Libraries
  • "+" > Libraries > .so files

總結

使用依賴於系統的庫時需要注意的事情:

  1. 他們會讓java應用與平台有關。

  2. System.loadLibrary()等同於Runtime.getRuntime.loadLibrary()

  3. System.loadLibary(library )加載到靜態初始化程序塊中,以便僅在包含類的加載時加載它,並 避免重新加載它,盡管如果未找到本機庫也可能導致ExceptionInitializerErorNoClassDefFoundError

  4. 另一個值得注意的要點是要注意確切的錯誤消息java.lang.UnsatisfiedLinkError拋出。 如果它顯示 Exception in thread "main" java.lang.UnsatisfiedLinkError: no dll in java.library.path 指JVM 是不是能夠找到並裝載庫。 如果顯示Exception in thread "main" java.lang.UnsatisfiedLinkError: com...(class or method name) ,則庫本身可能有問題,例如半復制的dll。




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM