本文介绍如何将x86平台的Java语言迁移到倚天云服务器。
由于Java应用会存在依赖的Java包,并且经常通过JNI调用C编译的本地库,如果直接迁移,可能会带来兼容性问题。迁移时可通过以下方法解决兼容性问题: 升级必要的依赖包:如果当前应用依赖的Java包不兼容ARM平台,则需要进行升级。 重新构建Java工程:应用本身开发的本地库,需要重新编译Java工程来解决。 ARM属于服务器端的新型架构,合适的JDK可以大大减少遇到问题的概率,提高性能。在倚天云服务器上,建议您使用以下两种OpenJDK: Alibaba Dragonwell:阿里巴巴自研OpenJDK的开源版本,在数据中心大规模Java应用部署情况下,可以大幅度提高稳定性、效率以及性能。更多信息,请参见Alibaba Dragonwell。 Eclipse Temurin:基于OpenJDK的开源Java SE产生的构建版本,适用于多个平台及Java SE版本。更多信息,请参见Eclipse Temurin。 部分Java依赖包存在不兼容ARM的问题,如果您运行应用时出现类似于以下的错误,说明使用了x86架构的本地库而导致在ARM平台出现兼容性问题。您可以通过升级依赖包解决。 扫描检测不兼容依赖包 扫描检测不兼容依赖包的一个相对简单的办法是扫描so文件,如果扫描结果中显示只存在x86架构的so文件,那么该so文件大概率不支持ARM。 以下为扫描依赖包so文件的参考脚本,您可以将扫描脚本放入编译好的应用目录中,执行脚本进行扫描。 警告 禁止在生产环境使用此脚本以免引起业务异常。 扫描完成后会输出类似于如下的信息,lz4-1.3.0中存在三个x86架构的so文件,不支持ARM架构,您可以升级到1.4.0修复此问题。 lz4软件从1.4.0版本起已更名为lz4-java。 常见兼容包 下表列出了部分常见可能存在兼容性问题的依赖包,建议您升级到推荐版本。 依赖包名称 推荐版本 依赖包名称 推荐版本 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及GCC即可重新构建。关于如何选择JDK及GCC,请参见选择JDK和C/C++语言迁移。背景信息
选择JDK
升级必要的依赖包
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)
#!/bin/bashrm -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 {} \;
========= 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
重新构建Java工程