GDAL(Geospatial Data Abstraction Library)是地理空間資料處理的標準庫,Java 專案若需使用其強大的矢量/格網讀寫、投影轉換功能,必須透過 JNI(Java Native Interface)載入原生動態庫。本文記錄從編譯 GDAL 到 Java 整合驗證的完整步驟與常見坑點。
nmake /f makefile.vc 編譯;Linux/macOS 執行 ./configure --with-java && make。gdaljni.dll (Windows) / libgdaljni.so (Linux) — JNI 橋接庫gdal.jar — Java API 封裝類別gdal_*.dll/so — GDAL 核心依賴庫將 gdaljni.dll 及所有 GDAL 依賴 DLL 複製到 {JAVA_HOME}/jre/bin(JDK 8)或 {JAVA_HOME}/bin(JDK 9+)。

缺點:污染系統 JRE,多專案版本衝突風險高,生產環境不推薦。
lib/native/win32-x86 或 linux-x64 目錄存放原生庫。-Djava.library.path=lib/native/win32-x86。System.setProperty("java.library.path", path) 在載入前動態設定(需配合 Field 反射修改 sys_paths 生效)。gdal.jar 加入 Classpath(Maven 專案可 mvn install:install-file 安裝至本地倉庫)。@Override
protected boolean doIsAvailable() throws Throwable {
try {
// 載入 JNI 橋接庫,會自動連帶載入 gdal 核心庫
System.loadLibrary("gdaljni");
// 簡單驗證 GDAL 版本
System.out.println("GDAL Version: " + gdal.VersionInfo("RELEASE_NAME"));
return true;
} catch (UnsatisfiedLinkError e) {
System.err.println("GDAL 載入失敗: " + e.getMessage());
return false;
}
}
| 錯誤現象 | 原因 | 解決方案 |
|---|---|---|
UnsatisfiedLinkError: no gdaljni in java.library.path | 原生庫路徑未加入 | 檢查 -Djava.library.path 或 PATH/LD_LIBRARY_PATH |
UnsatisfiedLinkError: Can't load IA 32-bit .dll on a AMD 64-bit platform | JVM 與 DLL 位數不匹配 | 確保 JDK、GDAL DLL 同為 64 位或 32 位 |
java.lang.UnsatisfiedLinkError: ... dependent library not found | GDAL 核心依賴 DLL 缺失 | 將完整 GDAL bin 目錄所有 DLL 放入同一路徑 |
Linux 下 libgdal.so.30: cannot open shared object file | 動態鏈接器找不到庫 | export LD_LIBRARY_PATH=/path/to/gdal/lib:$LD_LIBRARY_PATH |
使用 maven-nar-plugin 或 maven-shade-plugin 將原生庫打包進 JAR,運行時自動解壓至臨時目錄並載入,實現「單一 Fat JAR」部署。
gdaljni 原生庫與 gdal.jar。java.library.path。UnsatisfiedLinkError 的關鍵。