本文中含有需要您注意的重要提示信息,忽略该信息可能对您的业务造成影响,请务必仔细阅读。
本文介绍如何将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及GCC即可重新构建。关于如何选择JDK及GCC,请参见选择JDK和C/C++语言迁移。