本文介紹如何將基於x86平台的Java應用程式遷移到倚天雲端服務器。
背景資訊
由於Java應用會存在依賴的Java包,並且經常通過JNI調用C編譯的本地庫,如果隨即轉移,可能會帶來相容性問題。遷移時可通過以下方法解決相容性問題:
升級必要的依賴包:如果當前應用依賴的Java包不相容ARM平台,則需要進行升級。
重新構建Java工程:應用本身開發的本地庫,需要重新編譯Java工程來解決。
選擇JDK
ARM架構在伺服器端和其他領域都有廣泛應用。合適的JDK可以大大減少遇到問題的機率,提高效能。在倚天雲端服務器上,建議您使用以下兩種OpenJDK:
Alibaba Dragonwell:阿里巴巴自研OpenJDK的開源版本,在資料中心大規模Java應用部署情況下,可以大幅度提高穩定性、效率以及效能。更多資訊,請參見Alibaba Dragonwell。
Eclipse Temurin:基於OpenJDK的開源Java SE產生的構建版本,適用於多個平台及Java SE版本。更多資訊,請參見Eclipse Temurin。
升級必要的依賴包
部分Java依賴包存在不相容ARM的問題,如果您運行應用時出現類似於以下的錯誤,說明使用了x86架構的本地庫而導致在ARM平台出現相容性問題。您可以通過升級依賴包解決。
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)掃描檢測不相容依賴包
掃描檢測不相容依賴包的一個相對簡單的辦法是掃描so檔案,如果掃描結果中顯示只存在x86架構的so檔案,那麼該so檔案大機率不支援ARM。
以下為掃描依賴包so檔案的參考指令碼,您可以將掃描指令碼放入編譯好的應用目錄中,執行指令碼進行掃描。
警告禁止在生產環境使用此指令碼以免引起業務異常。
#!/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 {} \;掃描完成後會輸出類似於如下的資訊,lz4-1.3.0中存在三個x86架構的so檔案,不支援ARM架構,您可以升級到1.4.0修複此問題。
lz4軟體從1.4.0版本起已更名為lz4-java。
========= 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常見相容包
下表列出了部分常見可能存在相容性問題的依賴包,建議您升級到推薦版本。
依賴包名稱
推薦版本
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
重新構建Java工程
Java工程常用的構建工具如Maven等均與架構無關,因此構建工具無需更改。僅需設定好JDK即可重新構建。關於如何選擇JDK,請參見選擇JDK。