x86 から ARM ベースの YiTian ECS インスタンスに移行する際の Java の依存関係およびネイティブライブラリの互換性の問題を解決します。
背景情報
Java アプリケーションは、依存関係または Java Native Interface (JNI) を通じてネイティブ C ライブラリを呼び出す場合があります。直接移行すると、互換性の問題が発生する可能性があります。これらの問題を解決するには、以下の方法を使用します。
-
Java の依存関係が ARM プラットフォームと互換性がない場合は、必要な依存関係をアップグレードします。
-
ネイティブライブラリの問題を解決するには、Java プロジェクトを再構築します。
JDK の選択
ARM はサーバー環境で広く採用されています。適切な Java Development Kit (JDK) は、互換性の問題を低減し、パフォーマンスを向上させます。YiTian ECS インスタンスには、以下の OpenJDK ディストリビューションを推奨します。
-
Alibaba Dragonwell:Alibaba が提供するオープンソースの OpenJDK ディストリビューションで、データセンターにおける大規模な Java アプリケーションの安定性とパフォーマンスのために最適化されています。詳細については、「Alibaba Dragonwell」をご参照ください。
-
Eclipse Temurin:OpenJDK をベースにしたオープンソースの Java SE ビルドで、複数のプラットフォームおよび Java SE バージョンと互換性があります。詳細については、「Eclipse Temurin」をご参照ください。
必要な依存関係のアップグレード
一部の Java 依存関係には、x86 専用のネイティブライブラリが含まれています。アプリケーションの実行時に以下のようなエラーが報告された場合は、依存関係をアップグレードして問題を解決してください。
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 ファイルのみが見つかった場合、その依存関係は 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 に ARM をサポートしていない 3 つの x86 SO ファイルが含まれていることを示しています。この問題を解決するには、lz4-1.3.0 を 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 プロジェクトの再構築
Maven などの一般的なビルドツールはアーキテクチャに依存しないため、変更は不要です。再構築の前に JDK を設定してください。詳細については、「JDK の選択」をご参照ください。