Atasi masalah kompatibilitas dependensi Java dan pustaka native saat melakukan migrasi dari x86 ke Instance ECS YiTian berbasis ARM.
Latar Belakang
Aplikasi Java dapat memanggil pustaka C native melalui dependensi atau Java Native Interface (JNI). Migrasi langsung ke arsitektur ARM dapat menyebabkan masalah kompatibilitas. Gunakan metode berikut untuk mengatasinya:
-
Upgrade dependensi yang diperlukan jika dependensi Java tidak kompatibel dengan platform ARM.
-
Bangun ulang Proyek Java untuk mengatasi masalah pustaka native.
Pilih JDK
ARM banyak digunakan di lingkungan server. Pemilihan Java Development Kit (JDK) yang sesuai dapat mengurangi masalah kompatibilitas dan meningkatkan performa. Distribusi OpenJDK berikut direkomendasikan untuk Instance ECS YiTian:
-
Alibaba Dragonwell: distribusi OpenJDK open source dari Alibaba, dioptimalkan untuk stabilitas dan performa aplikasi Java skala besar di Pusat data. Lihat Alibaba Dragonwell.
-
Eclipse Temurin: build Java SE open source berbasis OpenJDK, kompatibel dengan berbagai platform dan versi Java SE. Lihat Eclipse Temurin.
Upgrade dependensi yang diperlukan
Beberapa dependensi Java mencakup pustaka native khusus x86. Jika muncul error seperti berikut saat menjalankan aplikasi, upgrade dependensi tersebut untuk mengatasi masalah ini.
Exception in thread "main" java.lang.UnsatisfiedLinkError: xxx.so: xxx.so:
cannot open shared object file: No such file or directory (Possible cause: can't load AMD 64-bit .so on a AARCH64-bit platform)
-
Pemindaian dependensi yang tidak kompatibel
Lakukan pemindaian file SO untuk mengidentifikasi dependensi yang tidak kompatibel. Jika hanya ditemukan file SO x86, kemungkinan dependensi tersebut tidak mendukung ARM.
Simpan skrip berikut ke direktori aplikasi yang telah dikompilasi dan jalankan untuk memindai file SO.
PeringatanJangan gunakan skrip ini di lingkungan produksi.
#!/bin/bash rm -rf tmp mkdir tmp for jar in `find . -name *.jar` do if [ -f $jar ] then echo $jar cp -r $jar tmp/ fi done cd tmp for test in `ls` do name=`echo $test | sed "s/.jar//g"` echo $name mkdir $name cp -r $test $name cd $name unzip -o $test cd .. done echo "========= starting Analysis ==========" find . -name "*.so" -exec file {} \;Contoh output berikut menunjukkan bahwa lz4-1.3.0 berisi tiga file SO x86 yang tidak mendukung ARM. Upgrade lz4-1.3.0 ke versi 1.4.0 untuk mengatasi masalah ini.
lz4 diubah namanya menjadi lz4-java mulai versi 1.4.0 dan seterusnya.
========= starting Analysis ========== ./lz4-1.3.0/win32/amd64/liblz4-java.so: PE32+ executable (DLL) (console) x86-64, for MS Windows ./lz4-1.3.0/linux/amd64/liblz4-java.so: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=2eafd0d4e86904e188b47565639318325108fffa, not stripped ./lz4-1.3.0/linux/i386/liblz4-java.so: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), dynamically linked, BuildID[sha1]=41041674439aea5d1fd6c62b6d88f63da7600c9f, not stripped -
Dependensi umum yang mungkin mengalami masalah kompatibilitas
Tabel berikut mencantumkan dependensi umum dengan masalah kompatibilitas yang diketahui. Upgrade ke versi yang direkomendasikan.
Nama dependensi
Versi yang direkomendasikan
lz4-java
1.4.0
jna
5.2.2
snappy-java
1.1.3
icu4j
68.1
sqlite-jdbc
3.20.0
forest-sqlite-jdbc
3.32.3.3
netty-tcnative
2.0.31
netty-transport-native-epoll
4.1.50
Bangun ulang Proyek Java
Alat build umum seperti Maven bersifat independen terhadap arsitektur dan tidak memerlukan perubahan. Konfigurasikan JDK terlebih dahulu sebelum membangun ulang. Lihat Pilih JDK.