System.loadLibrary("EasySpell"); // 拋出 UnsatisfiedLinkError
DLL 放置位置嘗試過:system32、類包目錄、class 同級目錄。CMD 下直接運行類測試通過,但 Eclipse 啟動 Tomcat 時失敗。
System.loadLibrary 搜尋路徑順序:
java.library.path 系統屬性指定的目錄列表PATH (Windows) / LD_LIBRARY_PATH (Linux)關鍵差異:
bin),DLL 不在 java.library.path 或 PATH 覆蓋範圍 → 找不到。java.library.path(最標準)在 Eclipse → Run Configurations → Arguments → VM arguments 添加:
-Djava.library.path=/absolute/path/to/dll/dir
Tomcat 啟動腳本 catalina.bat/sh 同理配置 CATALINA_OPTS。
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/path/to/dll。java.library.path(不推薦,JDK 9+ 受限)System.setProperty("java.library.path", "/path/to/dll");
// 需配合反射刷新 sys_paths 字段(JDK 8 有效,JDK 9+ 模組化後失效)
Field sysPaths = ClassLoader.class.getDeclaredField("sys_paths");
sysPaths.setAccessible(true);
sysPaths.set(null, null);
System.load(String absolutePath) 絕對路徑加載String dllPath = System.getProperty("user.dir") + "/native/EasySpell.dll";
System.load(dllPath); // 需確保運行時路徑正確
InputStream in = getClass().getResourceAsStream("/native/EasySpell.dll");
File tmp = File.createTempFile("EasySpell", ".dll");
Files.copy(in, tmp.toPath(), StandardCopyOption.REPLACE_EXISTING);
tmp.deleteOnExit();
System.load(tmp.getAbsolutePath());
核心原則:**構建/部署階段確定 DLL 絕對路徑,通過 java.library.path 或系統 PATH 註冊,避免依賴不穩定的工作目錄**。生產環境建議採用方案五(JAR 內嵌 + 臨時釋放),實現「單一 JAR/War 部署,無外部依賴」。