前言

信创(信息技术应用创新)是近年来政企 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 (若客户无特殊国产品牌要求可作为备选)

核心选型结论

  1. 老系统平移:使用 毕昇 JDK 8OpenJDK 8
  2. 新系统建设:首选 毕昇 JDK 17OpenJDK 17/21
  3. 架构适配:无论选择哪个版本,下载时必须注意区分 aarch64(ARM 架构,如鲲鹏/飞腾)和 x86_64 (海光/兆芯/Intel)。

三、安装 JDK(x86 和 ARM)

3.1 查看 CPU 架构

在进行任何安装前,必须运行以下命令查看服务器的 CPU 架构:

1
2
3
uname -m
# 若输出 x86_64 → 表明是海光、兆芯、Intel 或 AMD 等 x86 架构服务器
# 若输出 aarch64 → 表明是鲲鹏、飞腾等 ARM 架构服务器

[!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
2
3
4
5
6
7
8
# 1. 创建 Java 专属安装目录
sudo mkdir -p /usr/local/java

# 2. 下载毕昇 JDK 17(ARM64 架构版)
wget https://mirrors.huaweicloud.com/kunpeng/archive/compiler/bisheng_jdk/bisheng-jdk-17.0.10-linux-aarch64.tar.gz

# 3. 解压至安装目录
sudo tar -xzf bisheng-jdk-17.0.10-linux-aarch64.tar.gz -C /usr/local/java/

3.2.2 针对 x86 架构(海光/兆芯服务器)

1
2
3
4
5
6
7
8
# 1. 创建 Java 专属安装目录
sudo mkdir -p /usr/local/java

# 2. 下载毕昇 JDK 17(x86_64 架构版)
wget https://mirrors.huaweicloud.com/kunpeng/archive/compiler/bisheng_jdk/bisheng-jdk-17.0.10-linux-x86_64.tar.gz

# 3. 解压至安装目录
sudo tar -xzf bisheng-jdk-17.0.10-linux-x86_64.tar.gz -C /usr/local/java/

3.2.3 配置 JDK 17 环境变量

JDK 9+ 已经彻底废弃了 dt.jartools.jar,配置起来极其清爽,无需配置繁琐的 CLASSPATH

1
2
3
4
5
6
7
8
9
10
11
12
# 使用 tee 创建一个独立的环境变量管理脚本,解耦 /etc/profile,更加规范安全
sudo tee /etc/profile.d/jdk.sh << 'EOF'
export JAVA_HOME=/usr/local/java/bisheng-jdk-17.0.10
export PATH=$JAVA_HOME/bin:$PATH
EOF

# 使变量生效并验证
source /etc/profile.d/jdk.sh
java -version
# 输出类似下述内容即为成功:
# openjdk version "17.0.10" 2024-01-16 LTS
# BiSheng JDK 17.0.10 (build 17.0.10+12)

3.3 安装毕昇 JDK 8(老项目信创改造专用)

很多历史项目或企业级框架仅支持 JDK 8。毕昇 JDK 8 对 ARM64 也拥有极佳的硬件加速支持。

3.3.1 针对 ARM 架构(aarch64)

1
2
3
4
5
6
# 下载毕昇 JDK 8(ARM64 架构版)
wget https://mirrors.huaweicloud.com/kunpeng/archive/compiler/bisheng_jdk/bisheng-jdk-8u412-linux-aarch64.tar.gz

# 解压安装
sudo mkdir -p /usr/local/java
sudo tar -xzf bisheng-jdk-8u412-linux-aarch64.tar.gz -C /usr/local/java/

3.3.2 针对 x86 架构(x86_64)

1
2
3
4
5
6
# 下载毕昇 JDK 8(x86_64 架构版)
wget https://mirrors.huaweicloud.com/kunpeng/archive/compiler/bisheng_jdk/bisheng-jdk-8u412-linux-x86_64.tar.gz

# 解压安装
sudo mkdir -p /usr/local/java
sudo tar -xzf bisheng-jdk-8u412-linux-x86_64.tar.gz -C /usr/local/java/

3.3.3 配置 JDK 8 环境变量

[!IMPORTANT]
JDK 8 的核心注意事项:JDK 8 依然强烈依赖 dt.jartools.jar 作为核心库编译与运行支撑。因此在配置环境变量时,必须加上规范的 CLASSPATH 配置,否则在部分老项目中调用动态编译或本地库时会爆出 java.lang.NoClassDefFoundError

1
2
3
4
5
6
7
8
9
10
11
12
13
# 写入环境变量配置(包含完整的 CLASSPATH)
sudo tee /etc/profile.d/jdk.sh << 'EOF'
export JAVA_HOME=/usr/local/java/bisheng-jdk1.8.0_412
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$JAVA_HOME/bin:$PATH
EOF

# 使之生效并验证
source /etc/profile.d/jdk.sh
java -version
# 成功输出:
# openjdk version "1.8.0_412"
# BiSheng JDK 1.8.0_412 (build 1.8.0_412-b11)

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
2
3
4
5
6
7
8
9
# 1. 新建安装路径
sudo mkdir -p /usr/local/java

# 2. 解压压缩包(此处以实际上传的文件名为准)
sudo tar -xzf OpenJDK8U-jdk_aarch64_linux_hotspot_8u412b08.tar.gz -C /usr/local/java/

# 3. 重命名解压出的目录以方便日后维护(比如解压出的是 jdk8u412-b08)
cd /usr/local/java
sudo mv jdk8u412-b08 openjdk-8

第三步:完美编写通用全局环境变量

1
2
3
4
5
6
7
8
9
10
11
# 写入全局环境变量,统一管理
sudo tee /etc/profile.d/jdk.sh << 'EOF'
export JAVA_HOME=/usr/local/java/openjdk-8
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$JAVA_HOME/bin:$PATH
EOF

# 使生效并验证
source /etc/profile.d/jdk.sh
java -version
# 正确输出:openjdk version "1.8.0_412" ...

四、中间件适配

4.1 Spring Boot 应用(内嵌 Tomcat)

如果你的项目是 Spring Boot 内嵌 Tomcat,中间件适配很简单——基本上不需要改代码。唯一需要注意的是:

1
2
3
4
5
6
7
8
# application.yml
server:
port: 8080
tomcat:
# 信创环境有时文件上传路径需要调整
basedir: /data/app/temp
# 连接超时根据服务器性能调整
connection-timeout: 30000

4.2 使用东方通 TongWeb

如果客户强制要求用国产中间件(替换 WebLogic/WebSphere 的场景),需要把 Spring Boot 打成 WAR 包部署。

1
2
3
4
5
6
7
# pom.xml 中改为 WAR 打包
# <packaging>war</packaging>

mvn clean package -DskipTests

# 把生成的 WAR 放到 TongWeb 的部署目录
cp target/app.war /opt/TongWeb/autodeploy/

TongWeb 的部署方式和 Tomcat 差不多——有管理控制台(默认端口 9060)、支持热部署、支持 WAR 包自动部署。如果原来用的是 Tomcat,迁移成本很低。

4.3 数据库连接适配

从 MySQL 迁移到达梦 DM8 时,主要改动在 JDBC 驱动和连接 URL:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# MySQL 连接(原来)
spring:
datasource:
url: jdbc:mysql://localhost:3306/db?useUnicode=true&characterEncoding=utf8
driver-class-name: com.mysql.cj.jdbc.Driver
username: root
password: xxx

# 达梦 DM8 连接(信创环境)
spring:
datasource:
url: jdbc:dm://localhost:5236/db?schema=MY_DB
driver-class-name: dm.jdbc.driver.DmDriver
username: SYSDBA
password: xxx

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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# 阶段一:构建 JRE 运行环境,采用国产自主开源的 openEuler 作为基座
FROM openeuler/openeuler:22.03 as base

# 使用系统包管理器,它在构建时会自动根据目标架构(--platform)拉取对应 aarch64 或 x86_64 的 OpenJDK
RUN yum install -y java-1.8.0-openjdk-devel && \
yum clean all && \
rm -rf /var/cache/yum

# 阶段二:组装极简生产运行镜像
FROM openeuler/openeuler:22.03

WORKDIR /app

# 从阶段一复制已安装好的 JDK/JRE 环境
COPY --from=base /usr/lib/jvm/java-1.8.0-openjdk /usr/local/java/openjdk-8
# 复制应用程序 JAR 包及相关依赖
COPY target/app.jar /app/app.jar
# 复制国产达梦数据库 JDBC 驱动
COPY lib/DmJdbcDriver18.jar /app/lib/

# 环境变量配置
ENV JAVA_HOME=/usr/local/java/openjdk-8
ENV PATH=$JAVA_HOME/bin:$PATH
# 容器内 JVM 内存自适应调优参数(核心:利用 CGroup 限制内存,防止物理机 OOM 杀掉容器)
ENV JAVA_OPTS="-XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap -XX:MaxRAMPercentage=75.0 -Dfile.encoding=UTF-8"

# 创建专用的无特权系统运行用户,保障信创安全合规审计
RUN groupadd -r apprun && useradd -r -g apprun -s /sbin/nologin apprun && \
mkdir -p /data/app/logs && \
chown -R apprun:apprun /app /data/app

USER apprun

EXPOSE 8080
ENTRYPOINT ["sh", "-c", "java $JAVA_OPTS -Djava.ext.dirs=/app/lib -jar app.jar"]

5.1.2 在 x86 开发机上交叉构建 ARM64 镜像(Docker Buildx)

如果您的本地开发或 CI/CD 构建机是 x86 架构,但目标服务器是 ARM 架构,可以使用 Docker 官方推荐的 buildx 插件进行交叉编译:

1
2
3
4
5
6
7
8
9
10
11
12
# 1. 注册 QEMU 仿真器(在 x86 宿主机上模拟 ARM 运行环境)
docker run --privileged --rm tonistiigi/binfmt --install all

# 2. 创建并启用一个新的多架构构建器实例
docker buildx create --name xinchuang-builder --use
docker buildx inspect --bootstrap

# 3. 同时构建并推送 x86 和 ARM 双架构镜像(或仅推单架构)
docker buildx build \
--platform linux/amd64,linux/arm64 \
-t registry.example.com/myapp:1.0.0 \
--push .

5.1.3 信创专网离线环境:镜像打包与加载

政企专网通常无法访问私有 Docker 镜像仓库,需采用物理离线传输方式:

1
2
3
4
5
6
# 1. 在外网交叉构建并直接导出为 ARM64 归档包
docker buildx build --platform linux/arm64 -t myapp:arm64 --output type=docker -t myapp:arm64 .
docker save -o myapp-arm64.tar myapp:arm64

# 2. 将归档包拷贝至 ARM64 实体服务器后载入
docker load -i myapp-arm64.tar

5.2 实体机直接安装与部署(非容器生产标准)

如果不使用容器(如 Docker),在麒麟/统信等物理机或虚拟机上部署 Java 应用时,必须遵循严谨的生产级安全目录规范与性能调优策略

5.2.1 规划生产级目录结构与用户权限

出于信创安全合规审计的考量,严禁使用 root 用户直接启动 Java 应用。必须建立专用的非登录系统用户:

1
2
3
4
5
6
7
8
9
10
11
12
13
# 1. 创建名为 apprun 的无登录权限系统用户组与用户
sudo groupadd apprun
sudo useradd -r -g apprun -s /bin/false apprun

# 2. 创建规范的生产目录结构
sudo mkdir -p /opt/apps/myapp # 应用安装根目录
sudo mkdir -p /var/log/myapp # 日志独立存储目录
sudo mkdir -p /data/myapp/upload # 文件上传/临时文件存储目录

# 3. 授权给 apprun 用户
sudo chown -R apprun:apprun /opt/apps/myapp
sudo chown -R apprun:apprun /var/log/myapp
sudo chown -R apprun:apprun /data/myapp

5.2.2 物理实体机直接部署的执行脚本

我们将物理机应用启动、停止与重启高度封装为 /opt/apps/myapp/service.sh 控制脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
sudo tee /opt/apps/myapp/service.sh << 'EOF'
#!/bin/bash
# ======================================================================
# 信创物理实体机 Java 应用生产级控制脚本
# ======================================================================

APP_NAME="myapp"
APP_DIR="/opt/apps/myapp"
JAR_PATH="${APP_DIR}/app.jar"
PID_FILE="${APP_DIR}/app.pid"
LOG_DIR="/var/log/myapp"
LOG_PATH="${LOG_DIR}/stdout.log"

# 指定信创适配的 JDK 路径
export JAVA_HOME=/usr/local/java/bisheng-jdk1.8.0_412
export PATH=$JAVA_HOME/bin:$PATH

# ======================================================================
# 深度调优:针对国产 CPU(如鲲鹏 920 ARM 64 核服务器)的 JVM 启动参数配置
# ======================================================================
# 针对 JDK 8 物理机的生产调优参数
JAVA_OPTS="-server \
-Xms4g -Xmx4g -Xmn2g \
-XX:MetaspaceSize=256m -XX:MaxMetaspaceSize=512m \
-XX:+UseG1GC \
-XX:MaxGCPauseMillis=200 \
-XX:InitiatingHeapOccupancyPercent=45 \
-XX:+ParallelRefProcEnabled \
-XX:+ExplicitGCInvokesConcurrent \
-XX:AutoBoxCacheMax=20000 \
-Dfile.encoding=UTF-8 \
-Djava.awt.headless=true \
-Djava.security.egd=file:/dev/./urandom \
-Djava.io.tmpdir=/data/myapp/upload"

# 注:如果是 JDK 17,建议将 GC 改为性能极佳的低延迟 ZGC(毕昇 JDK 17 对 ZGC 有深度 ARM64 指令加速):
# -XX:+UseZGC -XX:ZAllocationSpikeTolerance=5

# ======================================================================

# 启动方法
start() {
if [ -f "$PID_FILE" ] && kill -0 $(cat "$PID_FILE") 2>/dev/null; then
echo "⚠️ [${APP_NAME}] 已经在运行中 (PID: $(cat $PID_FILE))"
exit 1
fi

echo "🚀 正在启动 [${APP_NAME}] ..."
# 使用 nohup 后台无限制启动
nohup java $JAVA_OPTS -jar $JAR_PATH > $LOG_PATH 2>&1 &

# 写入 PID 校验
echo $! > $PID_FILE
sleep 3

if kill -0 $! 2>/dev/null; then
echo "✅ 启动成功!(PID: $!)"
echo "👉 实时日志:tail -f ${LOG_PATH}"
else
echo "❌ 启动失败,请检查运行日志:${LOG_PATH}"
rm -f "$PID_FILE"
fi
}

# 停止方法 (支持优雅停机)
stop() {
if [ ! -f "$PID_FILE" ]; then
echo "⚠️ [${APP_NAME}] 未在运行"
return 0
fi

PID=$(cat "$PID_FILE")
echo "🛑 正在关闭 [${APP_NAME}] (PID: ${PID}) ..."

# 首先发送 SIGTERM (15) 信号,触发 Spring Boot / JVM 的 ShutdownHook,进行优雅停机
kill -15 $PID

# 轮询检查进程是否退出,最多等待 30 秒
for i in {1..30}; do
if ! kill -0 $PID 2>/dev/null; then
echo "✅ 服务已安全停止"
rm -f "$PID_FILE"
return 0
fi
sleep 1
done

# 超时仍未退出,则执行强制杀进程 SIGKILL (9)
echo "⚠️ 服务优雅停机超时,正在强制关闭进程..."
kill -9 $PID
rm -f "$PID_FILE"
echo "✅ 强制停止成功"
}

# 重启
restart() {
stop
sleep 2
start
}

# 状态检查
status() {
if [ -f "$PID_FILE" ] && kill -0 $(cat "$PID_FILE") 2>/dev/null; then
echo "🟢 运行中 (PID: $(cat $PID_FILE))"
else
echo "🔴 已停止"
fi
}

case "$1" in
start) start ;;
stop) stop ;;
restart) restart ;;
status) status ;;
*) echo "使用方法: $0 {start|stop|restart|status}" ;;
esac
EOF

# 授权脚本可执行权限,并移交所有权
sudo chmod +x /opt/apps/myapp/service.sh
sudo chown apprun:apprun /opt/apps/myapp/service.sh

5.2.3 实体机命令行启停实战

日常维护时,系统管理员应切换到 apprun 用户,或使用 sudo -u apprun 来安全执行脚本:

1
2
3
4
5
6
7
8
# 启动服务
sudo -u apprun /opt/apps/myapp/service.sh start

# 查看状态
sudo -u apprun /opt/apps/myapp/service.sh status

# 优雅关闭
sudo -u apprun /opt/apps/myapp/service.sh stop

5.3 注册为 Systemd 系统服务(企业级物理机最佳实践)

在信创物理机或虚拟机上,使用上述脚本虽然能用,但无法实现开机自动启动、宕机进程自动拉起等高可用能力。我们强烈推荐使用 Linux 标准的 Systemd 来管理 Java 应用守护进程。

5.3.1 编写生产标准 Service 脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# 使用管理权限创建 myapp 系统服务配置文件
# sudo nano /etc/systemd/system/myapp.service

[Unit]
Description=My Spring Boot Application
After=network.target syslog.target

[Service]
Type=forking
User=apprun
Group=apprun
WorkingDirectory=/opt/apps/myapp
# 关联刚才编写的 service.sh 脚本进行生命周期管理
ExecStart=/opt/apps/myapp/service.sh start
ExecStop=/opt/apps/myapp/service.sh stop
PIDFile=/opt/apps/myapp/app.pid

# 关键生产保障配置:宕机自动拉起
Restart=on-failure
RestartSec=15s

# 资源限制优化:极大提升高并发时物理机的最大文件打开数限制(规避 Too many open files 错误)
LimitNOFILE=65535
LimitNPROC=65535

[Install]
WantedBy=multi-user.target

5.3.2 运行与托管命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 1. 重新加载 Systemd 配置
sudo systemctl daemon-reload

# 2. 启用开机自启
sudo systemctl enable myapp

# 3. 启动应用
sudo systemctl start myapp

# 4. 查看当前运行状态与自启配置情况
sudo systemctl status myapp

# 5. 查看系统日志(Systemd 收集的实时控制台输出)
sudo journalctl -u myapp.service -f --no-tail

六、信创环境常见问题与排查

JDK 相关

问题 1:下错了架构的 JDK 包,在 ARM 机器上装了 x86 的包。

1
2
3
4
5
6
7
# 确认当前架构
uname -m

# 确认已安装 JDK 的架构
file $(which java)
# ELF 64-bit LSB executable, ARM aarch64 → 对的
# ELF 64-bit LSB executable, x86-64 → 错了,ARM 机器不该装 x86 版

问题 2:毕昇 JDK 某些 JVM 参数不生效。

毕昇 JDK 接近 OpenJDK,但个别参数可能有差异。部署前先在测试环境跑一遍全量启动参数,不要直接把原来 Oracle JDK 的参数原样搬过来。

数据库相关

问题 3:达梦 DM8 的大小写敏感问题。

DM8 默认大小写敏感,表名和字段名会自动转大写。如果之前 MySQL 用的是小写,需要在 DM8 初始化时加 CASE_SENSITIVE=0,或在 SQL 中给表名字段名加双引号。

1
2
3
-- 达梦中如果表名是小写,查询时要加双引号
SELECT * FROM "users"; -- 小写表名
SELECT * FROM USERS; -- 大写表名(默认)

架构差异

问题 4:JNI 本地库在 ARM 上不兼容。

如果应用依赖了调用 C/C++ 的 JNI 库(如某些加密库、图像处理库),需要在 ARM 上重新编译。JAR 包是跨架构的,但 .so 文件不是。

1
2
3
4
5
6
# 检查是否存在本地库依赖
jar -tf app.jar | grep "\.so$"

# 如果有,确保你拿到了对应架构的版本
file libnative.so
# 应该显示 ELF ARM aarch64(如果跑在 ARM 上)

七、信创适配检查清单

部署前逐项确认:

  • 确认目标服务器的 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 应用。真正的挑战不在于技术,而在于提前搞清楚目标环境的架构、拿到正确版本的依赖包、在测试环境完整验证一遍。等上了生产才发现架构不匹配就晚了。