天天看點

解決:java.lang.UnsatisfiedLinkError: Native Library *.dll already loaded in another classloader報錯解決:java.lang.UnsatisfiedLinkError: Native Library *.dll already loaded in another classloader報錯

@[BUG調試]

解決:java.lang.UnsatisfiedLinkError: Native Library *.dll already loaded in another classloader報錯

一、報錯:java.lang.UnsatisfiedLinkError: Native Library *.dll already loaded in another classloader

二、項目背景:SSM架構,使用InitializingBean接口類實作參數初始化

三、處理步驟:

  1. 通過斷點調試發現:InitializingBean接口類中的afterPropertiesSet()方法被執行了兩次,第二次初始化時報錯。
  2. 首先嘗試了解決afterPropertiesSet()調用兩次的問題,進行了多次嘗試都未能解決問題,時間關系于是開始從報錯本身開始着手。
  3. 通過網上查閱同類報錯的處理方法,篩選後發現部落客waiting_alone(https://blog.csdn.net/ld422586546/article/details/14522721)寫的符合我的報錯類型,錯誤發生原因是使用System.loadLibrary方法調用dll檔案時,JVM隻允許一個加載器來調用,是以第二次調用時無法清除已經調用的dll。裡面提到将調用dll的代碼單獨封裝成一個jar,将這個jar放到jre/lib/ext或tomcat/lib下。找到我調用報錯dll的類為Queue.java,因為這個類中引用了其他兩個類,于是将其他兩個類也一起打包成jar包。

    這裡參考了一下部落客Angel擠一擠 的方法(https://www.cnblogs.com/sxdcgaq8080/p/8126770.html)

  4. 首先将我需要打包的三個java類單獨剪切出來,因為涉及到引用路徑,是以要講該java類的父目錄也一起建立出來,比如我這裡之前引用該類路徑是import ionic.Msmq.Queue;則需要将ionic.Msmq目錄也建立出來,如圖所示:
  5. 打包成jar前需要将java檔案轉為class檔案,打開cmd,進入java類所在目錄

    因為要将三個都打包,是以直接将檔案夾下所有java轉為class,不然會報錯字元無法識别。執行:javac –encoding utf-8 *.java

    (我這裡執行的時候報錯javac為外部指令,該錯一般是java環境變量沒有配置好,重新配置一遍即可)

    編譯完成後将java檔案删除

  6. 回退到ionic的父目錄,執行jar –cvf MsmqJava.jar ionic(MsmqJava.jar是要打包成jar名,ionic是要打包的目錄)
  7. 最後将生成的jar引入到原項目中後,再将該jar包添加到jre/lib/ext檔案夾下。運作正常,報錯解決。(注意這裡jre目錄有兩個,一個是jdk裡面的,一個是jdk同級的,我試了兩台電腦,一台需要放在jdk下的jre目錄中,一台需要放在jdk同級的jre中,保險起見建議兩個都放)

四、參考網址:

[1]https://blog.csdn.net/ld422586546/article/details/14522721

[2]https://www.cnblogs.com/sxdcgaq8080/p/8126770.html

[3]https://jingyan.baidu.com/article/08b6a591bdb18314a80922a0.html