将x86平台的Java语言迁移到倚天云服务器

重要

本文中含有需要您注意的重要提示信息,忽略该信息可能对您的业务造成影响,请务必仔细阅读。

本文介绍如何将x86平台的Java语言迁移到倚天云服务器。

背景信息

由于Java应用会存在依赖的Java包,并且经常通过JNI调用C编译的本地库,如果直接迁移,可能会带来兼容性问题。迁移时可通过以下方法解决兼容性问题:

选择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,请参见选择JDKC/C++语言迁移