DynamoDB Local: Failed to load native library sqlite4java

TL;DR — DynamoDB Local 的儲存引擎在啟動時載入一個原生程式庫(sqlite4java),而 JVM 要嘛找不到它、要嘛無法執行它。兩個經典原因:你啟動 jar 時沒有 -Djava.library.path=./DynamoDBLocal_lib,或你在 Apple Silicon Mac 上而隨附的二進位檔是給 x86_64 的。將 JVM 指向 native-lib 資料夾、更新到目前版本的 DynamoDB Local,或執行多架構的 Docker 映像。

這是什麼意思

Failed to load native library:'libsqlite4java-osx-1.0.392.dylib'. ...
java.lang.UnsatisfiedLinkError: no sqlite4java-osx-x86_64-1.0.392 in java.library.path

DynamoDB Local 是一個 Java 應用程式,其磁碟儲存由一個原生(各 OS、各架構)程式庫支撐。UnsatisfiedLinkError 是 JVM 表示它無法連結該二進位檔 — 要嘛它根本不在程式庫路徑上,要嘛檔案存在但是為與你 JVM 不同的 OS/CPU 架構建置的。沒有它,模擬器無法啟動。

為什麼會發生

  • 缺少 -Djava.library.path — 下載檔將原生程式庫放在 DynamoDBLocal_lib/,而文件記載的啟動指令必須將 JVM 指向那裡。單純執行 java -jar DynamoDBLocal.jar(或從不同的工作目錄)就會遺失它們。
  • Apple Silicon(M 系列)+ x86_64 原生程式庫 — 較舊的 DynamoDB Local 建置與包裝器只隨附 Intel 的 libsqlite4java-osx 二進位檔;ARM64 JVM 拒絕載入它們(「no matching architecture」)。
  • 包裝器釘住舊的副本jest-dynamodbserverless-dynamodb-local 等工具會下載它們自己的 DynamoDB Local;快取的舊版本即使在你「更新」後仍保留過時的原生程式庫。
  • 原生程式庫解壓到被清理的暫存目錄 — 有些設定解壓到 OS 會清除的暫存資料夾,因此在重新開機前都可運作。

如何修正

  1. 以文件記載的方式從解壓後的資料夾啟動它:

    java -Djava.library.path=./DynamoDBLocal_lib -jar DynamoDBLocal.jar -sharedDb
  2. 更新 DynamoDB Local — 下載目前的版本;較新的建置解決了困擾舊版的 Apple Silicon 狀況。若有包裝器管理安裝,清除其快取/重新安裝,讓它確實取得新版本。

  3. 或以 Docker 完全避開原生程式庫amazon/dynamodb-local 映像是最不脆弱的路徑,並可在 Apple Silicon 上執行:

    docker run -p 8000:8000 amazon/dynamodb-local
  4. 在 Apple Silicon 上且無法變更舊建置時:Rosetta 2 下執行 x86_64 JDK(Intel 原生程式庫便與 JVM 相符),或以社群發布的 ARM64 版 sqlite4java 替換 libsqlite4java-osx.dylib

  5. 記憶體逃生口: 在目前的建置中,-inMemory 仍需要該程式庫 — 它不是缺少原生程式庫的變通方法;請改為修正路徑/架構。

模擬器啟動後,將你的工具指向它 — DynoTable 桌面應用程式http://localhost:8000 連到 DynamoDB Local,讓你無需撰寫指令碼就能建立表格與檢視資料。使用 DynamoDB JSON 轉換器以線路格式準備種子項目。

相關錯誤

References

最後驗證於 2026-07-13,對照上方連結的 AWS 官方文件。

不必透過主控台就能操作 DynamoDB

DynoTable 是一款快速的 DynamoDB 桌面用戶端 — 瀏覽表格、執行 SQL 風格的查詢,並在本機編輯項目。