DynamoDB Local: UnsupportedClassVersionError
TL;DR — 你的 Java 執行時比 DynamoDB Local 編譯時所針對的更舊。當前的 DynamoDB Local(v2.6.0 及更新,包括 v3.x)要求 JRE 17+——在 Java 8/11 上啟動它會使 JVM 以 UnsupportedClassVersionError 拒絕那些類檔案。安裝一個 Java 17+ 執行時(Temurin、Corretto……)並重新執行,或者用 amazon/dynamodb-local Docker 映象完全跳過本地 Java。
這是什麼意思
Error: A JNI error has occurred...
java.lang.UnsupportedClassVersionError: com/amazonaws/services/dynamodbv2/local/main/ServerRunner
has been compiled by a more recent version of the Java Runtime
(class file version 61.0), this version of the Java Runtime only
recognizes class file versions up to 52.0這些數字解碼出了不匹配:類檔案版本 61 是 Java 17,52 是 Java 8。jar 的位元組碼針對的是比你 PATH 上的 java 更新的 JVM,因此 JVM 在 DynamoDB Local 執行一行程式碼之前就中止了。AWS 明確記載了下限:v2.6.0+ 不能在比 17 更舊的 JRE 上執行。
為什麼會發生
- 系統
java仍然是 8 或 11——在較舊的 CI 映象和多年前安裝了 LTS JDK 的機器上很常見。 JAVA_HOME/PATH指向舊 JDK——安裝了一個較新的 JDK,但 shell 先解析到了舊的那個。- DynamoDB Local 的一次升級越過了這個要求——1.x 的 jar 能在 Java 8 上執行;用 2.x/3.x 替換它們悄悄地把門檻提高到了 17。
- 一個構建工具固定了工具鏈——配置了舊工具鏈的 Maven/Gradle 會在其下啟動嵌入式的 DynamoDB Local。
當安裝多個JDK時,which java和echo $JAVA_HOME經常不一致
— 該外掛可能會呼叫一個包裝器指令碼,即使在之後該指令碼仍然解析為 Java 11
你在 PATH 的其他位置安裝了 17。
固定到 eclipse-temurin:11 的 CI 影象是常見的來源 — 凹凸影象在管道中的 DynamoDB 本地步驟之前標記為 17。
如何修正
檢查實際執行的是什麼:
java -version安裝一個 Java 17+ 執行時(任意發行版——Eclipse Temurin、Amazon Corretto 等)並把你的 shell 指向它:
export JAVA_HOME=/path/to/jdk-17 export PATH="$JAVA_HOME/bin:$PATH" java -Djava.library.path=./DynamoDBLocal_lib -jar DynamoDBLocal.jar -sharedDb或者放棄本地 Java 要求——Docker 映象自帶一個相容的執行時:
docker run -p 8000:8000 amazon/dynamodb-local更新 CI 映象和工具鏈——在 DynamoDB Local 啟動的每一處都固定 Java 17+(測試執行器、Maven/Gradle 工具鏈),這樣錯誤就不會在每臺機器上再次出現。
一旦它在埠 8000 上啟動,就把你的工具指向 http://localhost:8000——DynoTable 桌面應用把 DynamoDB Local 作為一等端點來連線,而 DynamoDB Expression Builder 會草擬你將對它執行的查詢。
在 DynoTable 中定位
完全跳過本地 JRE:執行 docker run -p 8000:8000 amazon/dynamodb-local,
install DynoTable,並在設定中新增本地設定檔案→
設定檔案 → 新增 Profile 和端點 http://localhost:8000。 Test Connection
在開啟桌子之前確認 Local 已啟動。一旦啟動,
DynamoDB Expression Builder 草稿查詢你可以在模擬器上執行。
相關錯誤
- DynamoDB Local: unable to start process——Java 本身正確後的其他啟動失敗。
- DynamoDB Local: sqlite4java errors——原生庫的兄弟問題。
- DynamoDB Local:埠 8000 被佔用
- 學習:DynamoDB Local
來源
- Deploying DynamoDB locally on your computer — AWS DynamoDB Developer Guide(v2.6.0+ 的 JRE 17+ 要求、啟動命令、版本列表)
- DynamoDB local usage notes — AWS DynamoDB Developer Guide(@@P3@@和其他執行時選項)
- amazon/dynamodb-local — Docker Hub(官方映象捆綁了相容的 Java 執行時)