[Java]Windows XP環境下Sigar拋出UnsatisfiedLinkError異常

環境:

Windows XP Professional SP3
IBM JDK 8

異常情況:

在Windows 7和Windows 10操作系統中調用Sigar獲取系統信息正常,但是在Windows XP中日誌記錄UnsatisfiedLinkError異常。

原因:

在Windows XP系統下獲取的系統名與sigar程序中預期的存在差異,導致sigar判斷依賴的dll/so文件名錯誤。

 

在命令行中顯示的錯誤信息片段如下所示:

libsigar-x86-winnt.so (Not found in java.library.path)
org.hyperic.sigar.SigarException: libsigar-x86-winnt.so (Not found in java.library.path)
        at org.hyperic.sigar.Sigar.loadLibrary(Sigar.java:174)
        at org.hyperic.sigar.Sigar.<clinit>(Sigar.java:102)
        at RuntimeTest.cpu(RuntimeTest.java:119)
        at RuntimeTest.main(RuntimeTest.java:28)
Exception in thread "main" java.lang.UnsatisfiedLinkError: org/hyperic/sigar/Sigar.getCpuInfoList()[Lorg/hyperic/sigar/CpuInfo;
        at RuntimeTest.cpu(RuntimeTest.java:120)
        at RuntimeTest.main(RuntimeTest.java:28)

在記錄的日誌中只有UnsatisfiedLinkError部分的異常信息,這個異常表示找不到依賴的第三方dll/so文件。嘗試使用-Djava.library.path參數,在程序中輸出System.getProperty("java.library.path")也正常。

無意中發現命令行中第一行錯誤是libsigar-x86-winnt.so (Not found in java.library.path),而這個so文件不存在sigar提供的dll及so文件包中。通過查看sigar源碼,在ArchLoader.java中發現問題。

private final static String osName = System.getProperty("os.name");

public final static boolean IS_WIN32 = osName.startsWith("Windows");

在Windows XP系統中System.getProperty("os.name")是"Microsoft Windows"(根據網上其他人的使用情況來看,似乎只有我遇到這個問題,不知道是不是操作系統的原因還是jre的問題,導致獲取的系統名不匹配)。


處理方式1:修改sigar源碼,調整IS_WIN32判斷方式爲osName.index("Windows")>=0,重新編譯sigar。

處理方式2:在調用sigar前判斷系統類型如果是Windows XP,就設置os.name爲"Windows"。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章