DynamoDB Lokal: UnsupportedClassVersionError
TL;DR — Runtime Java Anda lebih lama dari waktu kompilasi DynamoDB Lokal. DynamoDB Lokal saat ini (v2.6.0 dan yang lebih baru, termasuk v3.x) memerlukan JRE 17+ — meluncurkannya di Java 8/11 membuat JVM menolak file kelas dengan UnsupportedClassVersionError. Instal runtime Java 17+ (Temurin, Corretto,…) dan jalankan kembali, atau lewati Java lokal sepenuhnya dengan image Docker amazon/dynamodb-local.
Apa artinya
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.0sebelum DynamoDB Lokal mengikat port. Versi file kelas 61 adalah Java 17, 52
adalah Java 8 — bytecode toples menargetkan JVM yang lebih baru daripada java di
PATH, sehingga JVM dibatalkan sebelum DynamoDB Lokal menjalankan satu baris. AWS
mendokumentasikan lantai secara eksplisit: v2.6.0+ tidak berjalan di JRE yang lebih lama dari 17.
Mengapa itu terjadi
- Sistem
javamasih 8 atau 11 — umum pada image dan mesin CI lama yang memasang LTS JDK bertahun-tahun yang lalu. - Titik
JAVA_HOME/PATHdi JDK lama — JDK yang lebih baru telah diinstal, namun shell akan menyelesaikan JDK lama terlebih dahulu. - Peningkatan DynamoDB Lokal melampaui persyaratan — toples 1.x dijalankan pada Java 8; menggantinya dengan 2.x/3.x secara diam-diam menaikkan standar menjadi 17.
- Alat build menyematkan rantai alat — Maven/Gradle yang dikonfigurasi dengan rantai alat lama meluncurkan DynamoDB Lokal yang tertanam di bawahnya.
Ketika beberapa JDK diinstal, which java dan echo $JAVA_HOME sering kali tidak setuju
— plugin mungkin memanggil skrip pembungkus yang masih tetap menggunakan Java 11 bahkan setelahnya
Anda menginstal 17 di tempat lain di PATH.
Gambar CI yang disematkan ke eclipse-temurin:11 sering menjadi sumber — gambarnya bertabrakan
tag ke 17 sebelum langkah Lokal DynamoDB di saluran Anda.
Bagaimana cara memperbaikinya
Periksa apa yang sebenarnya berjalan:
java -versionInstal runtime Java 17+ (distribusi apa pun — Eclipse Temurin, Amazon Corretto, dll.) dan arahkan shell Anda ke sana:
export JAVA_HOME=/path/to/jdk-17 export PATH="$JAVA_HOME/bin:$PATH" java -Djava.library.path=./DynamoDBLocal_lib -jar DynamoDBLocal.jar -sharedDbAtau hilangkan persyaratan Java lokal — image Docker mengirimkan runtime yang kompatibel:
docker run -p 8000:8000 amazon/dynamodb-localPerbarui gambar CI dan rantai alat — sematkan Java 17+ di mana pun DynamoDB Lokal dimulai (runner pengujian, rantai alat Maven/Gradle), sehingga kesalahan tidak muncul kembali di setiap mesin.
Temukan di DynoTable
Lewati JRE lokal sepenuhnya: jalankan docker run -p 8000:8000 amazon/dynamodb-local,
instal DynoTable, dan tambahkan profil Lokal di Pengaturan →
Profil → Tambahkan Profil dengan titik akhir http://localhost:8000. Uji Koneksi
konfirmasi Lokal sudah habis sebelum Anda membuka tabel. Setelah boot, itu
DynamoDB Expression Builder membuat draf kueri
Anda dapat melawan emulator.
Kesalahan terkait
- DynamoDB Lokal: tidak dapat memulai proses — kegagalan startup lainnya setelah Java sendiri benar.
- DynamoDB Lokal: kesalahan sqlite4java — saudara perpustakaan asli.
- DynamoDB Lokal: port 8000 sedang digunakan
- Pelajari: DynamoDB Lokal
Sumber
- Menyebarkan DynamoDB secara lokal di komputer Anda — Panduan Pengembang AWS DynamoDB (persyaratan JRE 17+ untuk v2.6.0+, perintah peluncuran, daftar versi)
- Catatan penggunaan lokal DynamoDB — Panduan Pengembang AWS DynamoDB (
-sharedDbdan opsi runtime lainnya) - amazon/dynamodb-local — Docker Hub (gambar resmi menggabungkan runtime Java yang kompatibel)