必须先执行uname -m确认架构(x86_64或aarch64),否则安装包错配将直接失败;再检查glibc、libstdc++、zlib等核心依赖是否满足,用rpm -qpr预查rpm真实依赖,离线部署需分层打包并强制安装deps-core层基础库。

确认系统架构和基础依赖是否缺失
离线安装 OpenJDK 前,uname -m 必须先跑一遍——不是为了“看看”,而是决定你后续所有操作成败的关键。输出是 x86_64 就不能下 aarch64 的 RPM;反过来在麒麟 V10 鲲鹏服务器上装 x86_64 包,rpm -ivh 会直接报 architecture is not supported,连错误提示都懒得绕弯。
基础依赖不靠网络就无法自动补全,但你能提前预判哪些必须手动带进来:
-
glibc:OpenJDK 11+ 至少需要glibc >= 2.17(CentOS 7/RHEL 7 起步线),老系统如 CentOS 6 不兼容,别试 -
libstdc++:部分发行版(如某些定制麒麟镜像)可能缺libstdc++.so.6(GLIBCXX_3.4.20),运行java -version时卡在symbol lookup error -
zlib和openssl-libs:影响 JCE、SSL/TLS 初始化,Spring Boot 启动时报java.security.ProviderException: Could not initialize NSS往往就是它
用 rpm -qpR 检查 RPM 包真实依赖
别信官网文档写的“无依赖”。下载好 jdk-11.0.x_linux-x64_bin.rpm 后,在联网机器上执行:
rpm -qpR jdk-11.0.x_linux-x64_bin.rpm
你会看到一长串 libc.so.6、libpthread.so.0 这类 soname,它们对应的是系统级共享库,不是独立软件包——也就是说,只要系统自带的 glibc 版本够,这些不用额外装。但若出现 javapackages-tools、tzdata-java 这类明确的包名,就得一并下载对应 RPM。
常见坑点:
-
tzdata-java在部分麒麟 V10 SP1 镜像里被精简掉了,java.time相关操作(比如ZonedDateTime.now())会默认 fallback 到 GMT,时区显示全错 -
java-11-openjdk-headless和java-11-openjdk是两个包:后者含 AWT/Swing GUI 库,服务器环境选前者即可,省空间也少依赖 - Amazon Corretto 或 Eclipse Temurin 的 RPM 通常把依赖收得更紧,
rpm -qpR输出行数明显少于 Oracle OpenJDK 构建版
离线依赖打包策略:宁多勿少,但要分层
一个干净的离线部署包目录建议按三层组织:
openjdk11-offline/
├── jdk/
│ └── jdk-11.0.x+xx-linux-x64.rpm
├── deps-core/
│ ├── glibc-2.17-324.el7_9.x86_64.rpm
│ ├── libstdc++-4.8.5-44.el7.x86_64.rpm
│ └── zlib-1.2.7-20.el7_9.x86_64.rpm
└── deps-opt/
├── tzdata-java-2024a-1.el7.noarch.rpm
└── java-11-openjdk-headless-11.0.x.x-1.el7_9.x86_64.rpm
deps-core 里的包必须全部安装(用 rpm -Uvh --force --nodeps 强制覆盖旧版);deps-opt 视场景启用——比如你确认应用不涉及时区转换,tzdata-java 可跳过。
注意:--nodeps 是双刃剑。它能绕过依赖检查,但若真缺 glibc 这种底层库,装完 JDK 后 java 命令根本不会出现在 PATH 里,连报错机会都不给。
验证依赖是否真正就位
装完所有 RPM 后,别急着 source /etc/profile,先做两件事:
- 运行
ldd $(which java),检查输出里有没有not found行——有就说明某个 .so 没到位,回溯到deps-core补漏 - 执行
java -XshowSettings:properties -version 2>&1 | grep -E "(os\.name|os\.arch|java.home)",确认java.home指向正确路径,且os.arch与uname -m一致 - 如果用的是
alternatives管理多版本,alternatives --config java必须能列出新装的 JDK 条目,否则/usr/bin/java软链接不会生效
最易被忽略的是:某些国产 Linux 发行版(如早期麒麟 V10)默认关闭了 execstack,而部分 OpenJDK 11 构建版的 libjvm.so 含 execstack 标记,导致 JVM 启动失败,报 Permission denied。此时需用 execstack -s /path/to/libjvm.so 手动开启——这个动作无法离线预置,必须在目标机上操作。











