Java 应用的信创环境迁移与多架构(x86 / ARM)部署
前言
信创(信息技术应用创新)是近年来政企 IT 采购的重要方向。简单说就是把 IT 基础设施从国外的产品替换为国产产品——从 CPU、操作系统、数据库到中间件,全链路国产化。
对于开发者来说,信创意味着你可能要把 Java 应用部署在 ARM 架构的鲲鹏/飞腾服务器上,跑在麒麟或统信操作系统上,连接达梦或 GaussDB 数据库。这篇文章从实战角度讲清楚这个链路。
一、信创是什么
信创的目标是建立自主可控的 IT 基础设施。目前信创生态的主流产品如下:
硬件层(CPU)
| 架构 | 厂商 | 代表型号 | 信创场景覆盖 |
|---|---|---|---|
| ARM | 华为鲲鹏 | Kunpeng 920 | 服务器主流,政务云广泛使用 |
| ARM | 飞腾 | FT-2000/64, S2500 | 党政军办公、服务器 |
| x86 | 海光 | 海光 7000 系列 | AMD Zen 架构授权,高性能计算 |
| x86 | 兆芯 | KX-6000 系列 | 桌面办公 |
| LoongArch | 龙芯 | 3A6000 | 自主指令集,桌面和低端服务器 |
关键结论:信创服务器端目前 ARM(鲲鹏/飞腾)占主流,x86(海光)也在增长。你的 Java 应用必须同时兼容 x86 和 ARM 两种架构。
操作系统层
| OS | 厂商 | 内核 | 对标 |
|---|---|---|---|
| 银河麒麟 V10 | 麒麟软件 | Linux(服务器版基于 openEuler) | RHEL/CentOS |
| 统信 UOS | 统信软件 | Linux(Deepin 分支) | Ubuntu |
| 麒麟信安 | 麒麟信安 | Linux(openEuler) | 安全加固场景 |
| openEuler | 华为 | Linux | 开源社区版,生态最活跃 |
日常操作上,麒麟和统信就是 Linux——命令一样、目录结构一样、配置方式一样。如果有 Linux 基础,适应成本很低。区别主要在软件包格式和默认仓库上。
数据库层
| 数据库 | 厂商 | 兼容性 | 适用场景 |
|---|---|---|---|
| 达梦 DM8 | 达梦数据库 | 兼容 Oracle 语法 | 大型政企 OLTP |
| GaussDB | 华为 | 兼容 PostgreSQL/MySQL | 分布式场景 |
| 人大金仓 Kingbase | 人大金仓 | 兼容 Oracle/MySQL/PostgreSQL | 政务系统 |
| OceanBase | 蚂蚁集团 | 兼容 MySQL | 金融级分布式 |
| 南大通用 GBase | 南大通用 | 兼容 Oracle | 数据仓库 |
中间件层
| 中间件 | 厂商 | 说明 |
|---|---|---|
| 东方通 TongWeb | 东方通 | 兼容 Java EE,替代 WebLogic |
| 金蝶 Apusic | 金蝶 | 兼容 Java EE |
| 中创 InforSuite | 中创中间件 | 兼容 Java EE |
| 宝兰德 BES | 宝兰德 | 替代 WebLogic/WebSphere |
对 Java 开发者来说关键的一点:这些中间件都遵循 Java EE / Jakarta EE 标准,如果你的应用用的是 Spring Boot 内嵌 Tomcat,通常不需要换中间件,只要 JDK 和 OS 适配就行。
二、JDK 选型:信创环境的 JDK 该用哪个
信创项目对 JDK 有明确要求——不能用 Oracle JDK。在实际项目中,虽然 JDK 17 和 JDK 21 逐渐成为新项目的首选,但由于大量政企历史遗留系统或第三方中间件的限制,JDK 8 在信创迁移中依然占据着极大的市场份额。
目前信创主流的 JDK 选择与架构支持如下:
| JDK | 架构支持 | 信创合规性 | 适用版本 | 推荐度与选型建议 |
|---|---|---|---|---|
| 毕昇 JDK(BiSheng) | x86 + ARM (鲲鹏优化) | 华为出品,深度适配国产芯片 | 8、17、21 | 极高(ARM 鲲鹏服务器首选,针对 Kunpeng 920 做过 GC/JIT 深度调优) |
| 麒麟 JDK | x86 + ARM | 麒麟软件官方生态适配 | 8、17 | 极高(银河麒麟系统原生推荐,合规性极佳) |
| OpenJDK | x86 + ARM | 全球开源标准,无商业闭源协议风险 | 8、11、17、21 | 高(最稳妥的开源方案,兼容性与业界生态最好) |
| Dragonwell(龙井) | x86 + ARM | 阿里巴巴开源,经双十一高并发实战 | 8、11、17 | 中(适合高并发、大数据量场景) |
| Oracle JDK | x86 + ARM | 不合规 / 有商业授权版权风险 | 8、17 | 不可用(信创验收审计一票否决项) |
| Adoptium / Temurin | x86 + ARM | 开源但属于 Eclipse 基金会 | 8、17、21 | 中(若客户无特殊国产品牌要求可作为备选) |
核心选型结论:
- 老系统平移:使用 毕昇 JDK 8 或 OpenJDK 8。
- 新系统建设:首选 毕昇 JDK 17 或 OpenJDK 17/21。
- 架构适配:无论选择哪个版本,下载时必须注意区分
aarch64(ARM 架构,如鲲鹏/飞腾)和x86_64(海光/兆芯/Intel)。
三、安装 JDK(x86 和 ARM)
3.1 查看 CPU 架构
在进行任何安装前,必须运行以下命令查看服务器的 CPU 架构:
1 | uname -m |
[!IMPORTANT]
银河麒麟 V10 和统信 UOS 均为 Linux 内核,均完全支持uname -m命令。千万不要混用架构安装包,否则会导致二进制程序无法执行,报错cannot execute binary file: Exec format error。
3.2 安装毕昇 JDK 17(ARM 与 x86 双架构部署)
毕昇 JDK 对鲲鹏 ARM 架构的 GC、JIT 以及向量化指令集做过了深度编译优化,以下是手动部署方式:
3.2.1 针对 ARM 架构(鲲鹏/飞腾服务器)
1 | # 1. 创建 Java 专属安装目录 |
3.2.2 针对 x86 架构(海光/兆芯服务器)
1 | # 1. 创建 Java 专属安装目录 |
3.2.3 配置 JDK 17 环境变量
JDK 9+ 已经彻底废弃了 dt.jar 和 tools.jar,配置起来极其清爽,无需配置繁琐的 CLASSPATH:
1 | # 使用 tee 创建一个独立的环境变量管理脚本,解耦 /etc/profile,更加规范安全 |
3.3 安装毕昇 JDK 8(老项目信创改造专用)
很多历史项目或企业级框架仅支持 JDK 8。毕昇 JDK 8 对 ARM64 也拥有极佳的硬件加速支持。
3.3.1 针对 ARM 架构(aarch64)
1 | # 下载毕昇 JDK 8(ARM64 架构版) |
3.3.2 针对 x86 架构(x86_64)
1 | # 下载毕昇 JDK 8(x86_64 架构版) |
3.3.3 配置 JDK 8 环境变量
[!IMPORTANT]
JDK 8 的核心注意事项:JDK 8 依然强烈依赖dt.jar和tools.jar作为核心库编译与运行支撑。因此在配置环境变量时,必须加上规范的 CLASSPATH 配置,否则在部分老项目中调用动态编译或本地库时会爆出java.lang.NoClassDefFoundError。
1 | # 写入环境变量配置(包含完整的 CLASSPATH) |
3.4 OpenJDK 深度安装指南(在线与离线双模部署)
除了厂商定制优化的 JDK 外,标准的开源社区版 OpenJDK 是信创项目中最具普适性、合规审计毫无风险的稳妥底盘。
3.4.1 在线模式:基于包管理器一键安装
如果您的服务器已配置好外网代理或者内部自建的 YUM/APT 私有镜像源,可使用系统包管理器极速安装:
- 银河麒麟 V10 / openEuler / CentOS(RPM 体系,使用 dnf 或 yum):
1
2
3
4
5# 安装 OpenJDK 8 (JRE + 核心开发工具链)
sudo yum install java-1.8.0-openjdk java-1.8.0-openjdk-devel -y
# 安装 OpenJDK 17
sudo yum install java-17-openjdk java-17-openjdk-devel -y - 统信 UOS / Ubuntu / Debian(DPKG 体系,使用 apt):
1
2
3
4
5
6
7
8# 强制拉取最新的本地源信息
sudo apt update
# 安装 OpenJDK 8
sudo apt install openjdk-8-jdk -y
# 安装 OpenJDK 17
sudo apt install openjdk-17-jdk -y
3.4.2 离线模式:基于二进制 Tar.gz 包手动部署(信创专网首选)
在党政军或保密程度极高的信创局域专网中,服务器通常是完全隔离、无法连接互联网的。这就需要我们在外网下载好通用的 OpenJDK 二进制包进行全手动离线迁移:
第一步:在外网环境下载对应架构的 OpenJDK 官方发行版
推荐使用 Eclipse 基金会的 Temurin (Adoptium) 或者官方上游的无协议包。
- OpenJDK 8 ARM64 下载链接:
https://github.com/adoptium/temurin8-binaries/releases/download/jdk8u412-b08/OpenJDK8U-jdk_aarch64_linux_hotspot_8u412b08.tar.gz - OpenJDK 8 x86_64 下载链接:
https://github.com/adoptium/temurin8-binaries/releases/download/jdk8u412-b08/OpenJDK8U-jdk_x64_linux_hotspot_8u412b08.tar.gz - OpenJDK 17 ARM64 下载链接:
https://github.com/adoptium/temurin17-binaries/releases/download/jdk-17.0.11%2B9/OpenJDK17U-jdk_aarch64_linux_hotspot_17.0.11_9.tar.gz - OpenJDK 17 x86_64 下载链接:
https://github.com/adoptium/temurin17-binaries/releases/download/jdk-17.0.11%2B9/OpenJDK17U-jdk_x64_linux_hotspot_17.0.11_9.tar.gz
第二步:利用 U 盘/文件分发系统将压缩包上传至信创服务器,并解压
以部署 OpenJDK 8 ARM64 (aarch64) 为例:
1 | # 1. 新建安装路径 |
第三步:完美编写通用全局环境变量
1 | # 写入全局环境变量,统一管理 |
四、中间件适配
4.1 Spring Boot 应用(内嵌 Tomcat)
如果你的项目是 Spring Boot 内嵌 Tomcat,中间件适配很简单——基本上不需要改代码。唯一需要注意的是:
1 | # application.yml |
4.2 使用东方通 TongWeb
如果客户强制要求用国产中间件(替换 WebLogic/WebSphere 的场景),需要把 Spring Boot 打成 WAR 包部署。
1 | # pom.xml 中改为 WAR 打包 |
TongWeb 的部署方式和 Tomcat 差不多——有管理控制台(默认端口 9060)、支持热部署、支持 WAR 包自动部署。如果原来用的是 Tomcat,迁移成本很低。
4.3 数据库连接适配
从 MySQL 迁移到达梦 DM8 时,主要改动在 JDBC 驱动和连接 URL:
1 | # MySQL 连接(原来) |
DM8 的 JDBC 驱动在达梦安装目录 /opt/dmdbms/drivers/jdbc/ 下,把 DmJdbcDriver18.jar 放到项目的 lib/ 里,或者在 Maven 中引用。
五、应用打包与部署
5.1 构建适配多架构的 Docker 镜像(容器部署方案)
在现代容器化部署中,信创平台最大的挑战是开发机多为 Intel/AMD(x86_64)架构,而生产物理机多为鲲鹏/飞腾(aarch64)架构。这就需要我们能够构建出支持跨架构无缝运行的 Docker 镜像。
5.1.1 编写完全合规、多架构自适应的 Dockerfile
为了避免把宿主机上的 JDK 强行复制到镜像中从而导致架构不匹配的问题,我们推荐采用 多阶段构建(Multi-stage Build),或者直接利用支持多架构的国产合规基础镜像(如 openEuler 基座)。
以下是适用于信创生产环境的、支持自动架构识别的多架构 Dockerfile:
1 | # 阶段一:构建 JRE 运行环境,采用国产自主开源的 openEuler 作为基座 |
5.1.2 在 x86 开发机上交叉构建 ARM64 镜像(Docker Buildx)
如果您的本地开发或 CI/CD 构建机是 x86 架构,但目标服务器是 ARM 架构,可以使用 Docker 官方推荐的 buildx 插件进行交叉编译:
1 | # 1. 注册 QEMU 仿真器(在 x86 宿主机上模拟 ARM 运行环境) |
5.1.3 信创专网离线环境:镜像打包与加载
政企专网通常无法访问私有 Docker 镜像仓库,需采用物理离线传输方式:
1 | # 1. 在外网交叉构建并直接导出为 ARM64 归档包 |
5.2 实体机直接安装与部署(非容器生产标准)
如果不使用容器(如 Docker),在麒麟/统信等物理机或虚拟机上部署 Java 应用时,必须遵循严谨的生产级安全目录规范与性能调优策略。
5.2.1 规划生产级目录结构与用户权限
出于信创安全合规审计的考量,严禁使用 root 用户直接启动 Java 应用。必须建立专用的非登录系统用户:
1 | # 1. 创建名为 apprun 的无登录权限系统用户组与用户 |
5.2.2 物理实体机直接部署的执行脚本
我们将物理机应用启动、停止与重启高度封装为 /opt/apps/myapp/service.sh 控制脚本:
1 | sudo tee /opt/apps/myapp/service.sh << 'EOF' |
5.2.3 实体机命令行启停实战
日常维护时,系统管理员应切换到 apprun 用户,或使用 sudo -u apprun 来安全执行脚本:
1 | # 启动服务 |
5.3 注册为 Systemd 系统服务(企业级物理机最佳实践)
在信创物理机或虚拟机上,使用上述脚本虽然能用,但无法实现开机自动启动、宕机进程自动拉起等高可用能力。我们强烈推荐使用 Linux 标准的 Systemd 来管理 Java 应用守护进程。
5.3.1 编写生产标准 Service 脚本
1 | # 使用管理权限创建 myapp 系统服务配置文件 |
5.3.2 运行与托管命令
1 | # 1. 重新加载 Systemd 配置 |
六、信创环境常见问题与排查
JDK 相关
问题 1:下错了架构的 JDK 包,在 ARM 机器上装了 x86 的包。
1 | # 确认当前架构 |
问题 2:毕昇 JDK 某些 JVM 参数不生效。
毕昇 JDK 接近 OpenJDK,但个别参数可能有差异。部署前先在测试环境跑一遍全量启动参数,不要直接把原来 Oracle JDK 的参数原样搬过来。
数据库相关
问题 3:达梦 DM8 的大小写敏感问题。
DM8 默认大小写敏感,表名和字段名会自动转大写。如果之前 MySQL 用的是小写,需要在 DM8 初始化时加 CASE_SENSITIVE=0,或在 SQL 中给表名字段名加双引号。
1 | -- 达梦中如果表名是小写,查询时要加双引号 |
架构差异
问题 4:JNI 本地库在 ARM 上不兼容。
如果应用依赖了调用 C/C++ 的 JNI 库(如某些加密库、图像处理库),需要在 ARM 上重新编译。JAR 包是跨架构的,但 .so 文件不是。
1 | # 检查是否存在本地库依赖 |
七、信创适配检查清单
部署前逐项确认:
- 确认目标服务器的 CPU 架构(
uname -m:x86_64 / aarch64) - JDK 选择信创合规版本(毕昇 JDK / 麒麟 JDK / OpenJDK),确认架构匹配
- 操作系统确认:麒麟 V10 / 统信 UOS / openEuler
- 数据库驱动是否支持国产数据库(达梦 / GaussDB / 人大金仓)
- 应用中的本地库(.so / .dll)是否有对应架构版本
- 中间件是否需要替换(Spring Boot 内嵌 Tomcat 通常不用换)
- 加密算法是否符合国密要求(SM2/SM3/SM4)
- 日志存储路径、文件上传路径在国产 OS 上是否存在权限问题
- 部署完成后在目标环境跑一遍冒烟测试
信创部署本身不复杂——本质上就是在不同架构的 Linux 上部署 Java 应用。真正的挑战不在于技术,而在于提前搞清楚目标环境的架构、拿到正确版本的依赖包、在测试环境完整验证一遍。等上了生产才发现架构不匹配就晚了。