简介:面向64位ARM架构的JDK 8u232 Linux安装包,专为华为鲲鹏920处理器与银河麒麟V10操作系统准备,适合在信创及国产化环境搭建Java运行平台的开发、运维人员。压缩包内共299个文件,约96.63MB,以so动态库、jar归档、properties配置文件、jdk相关命令行工具及man手册页为主体,解压后即是一套相对完整的JDK 1.8.0_232开发运行环境。目前已有1194人学习/下载,反映出该组合在国产平台部署中的常见需求。除了javac、java、jar、javadoc等基础工具,包内还提供JVM运行所需的ARM64本地化动态库、安全管理相关证书库以及多个调试与监控命令,可支撑Java应用的编译、打包、运行、排障和性能分析。对需要在鲲鹏920或银河麒麟V10上快速落地Java服务的团队而言,这份离线安装包省去了自行寻找适配版本的麻烦,能够直接解压配置后投入使用。 一个jdk-8u232-linux-aarch64.tar.gz文件,放在下载目录里还没什么感觉,等你真正站到一台 aarch64 的 Linux 服务器前面,才会意识到这个包有多关键。我记得第一次在一台鲲鹏机器上部署 Java 服务,随手拿了个 x86_64 的 JDK 就往上装,结果 java 命令直接报Exec format error,白折腾了半小时。这篇文章就把这个包从下载、校验、解压、配置到验证的完整链路讲清楚,顺便把 aarch64 架构、8u232 版本这些容易踩坑的细节也一并说透。无论你是给国产化服务器装环境,还是在 ARM 开发板上跑 Java,这篇都适用。
1. 版本与架构:先搞清楚手里拿的是什么
1.1 8u232 在 Java 8 版本序列中的位置
Java 8 是目前为止生命周期最长的 LTS 版本之一。8u232 是 2019 年 10 月发布的一个 update 版本,这个版本所处的阶段比较特殊——Oracle 从 8u211 开始把 JDK 的许可协议从 BCL 切换到了 OTN License Agreement,商用场景需要订阅,而 8u202 是最后一个可以免费商用的版本。所以如果你是在企业内部生产环境用,要留意这个许可边界;但个人开发、学习、测试,或者使用 OpenJDK 发行版,就没有这个问题。
那 8u232 本身有什么好讲的?它修复了一批安全漏洞,包括一些可以在远程被利用的漏洞,所以从纯安全性角度,它比 8u202 更值得用。很多老项目的技术栈(Spring Boot 1.x、老版本的 Dubbo、Hadoop 生态某些组件)在 Java 8 上跑得最稳,往上换 Java 11 或 17 会出现各种兼容性问题,往下用 7 又太老。这就是为什么到现在还有大量项目钉死在 Java 8,而 8u232 这个版本因为稳定性和安全修复的平衡,成了很多人选择的落点。
1.2 aarch64 到底是什么,和 arm64 有什么区别
aarch64 是 ARM 公司对 64 位执行状态(ARMv8-A 及之后架构)的官方称呼,通常也叫 ARM64。在 Linux 世界里,aarch64 和 arm64 这两个词经常混用,指的是同一个东西。区别只是叫法来源不同:aarch64 是 ARM 官方术语,arm64 是 Linux 内核和 Debian/Ubuntu 等发行版在包管理里使用的名称。比如在 Ubuntu 上执行dpkg --print-architecture,输出的就是arm64,而uname -m输出的是aarch64。
这个架构的硬件近几年越来越常见:华为鲲鹏 920、飞腾 FT-2000/腾锐系列、Ampere Altra、AWS Graviton,还有各类 ARM 开发板(树莓派 4B 之后的 64 位系统也是 aarch64)。在这些设备上跑 Java,就必须用专门为 aarch64 编译的 JDK。x86_64 的 JDK 在 aarch64 上完全跑不了,因为 CPU 指令集根本不同,就像你不能把柴油加进汽油车里。
这里顺便说一句:不要因为网上有人说“aarch64 就是 arm64”就直接随便下一个arm64的包,要去确认它真的是为 Linux aarch64 编译的。有些arm64的包可能是 macOS 的(Apple Silicon 也是 ARM64 架构),后缀不一样,装上去同样报 Exec format error。认准linux-aarch64这个组合。
2. 安装前的准备:确认架构、下载与校验
2.1 一条命令确认目标机器架构
动手安装之前,先确认你的目标机器到底是什么架构。这一条最容易被忽略,但错一步后面全是坑。在终端执行:
uname -m如果输出aarch64,那这个包就是对的。如果输出x86_64,说明你拿错包了。还可以用lscpu看更详细的信息,其中Architecture字段会显示aarch64。另外一个方法是看系统自带的二进制文件类型:
file /bin/ls输出里会包含ARM aarch64字样。这个命令在排查“为什么我的 java 跑不起来”的时候尤其有用。
还有一个容易忽略的点:如果你是在 Docker 容器里操作,uname -m看到的是宿主机的内核架构。也就是说,只要宿主机是 aarch64,容器里即使没显式指定平台,看到的也是aarch64。反过来,在 x86_64 宿主机上用模拟器跑 aarch64 容器,uname -m可能显示aarch64,但性能会有损耗。确认了架构之后再往下走,能省掉很多无谓的排查时间。
2.2 下载渠道与文件完整性校验
Oracle 官方下载需要注册账号,这个流程比较烦,但官方包的完整性和安全性最有保障。下载页面选择Java SE 8,然后在产品列表里找Linux ARM 64 Compressed Archive,文件名就是jdk-8u232-linux-aarch64.tar.gz。注意别选成Linux x64 Compressed Archive,那是给 x86_64 用的。
如果你不想注册 Oracle 账号,也可以用开源的 OpenJDK 发行版,比如 Eclipse Temurin(Adoptium 项目)、Azul Zulu、BellSoft Liberica,它们都提供 aarch64 的 Linux 构建。选哪个取决于你们的合规要求和运维习惯。我个人在国产化服务器上遇到过只允许用特定发行版的客户,这种情况要先问清楚再动手。
下载完之后,强烈建议做一次哈希校验。Oracle 官网上每一版都公布了 SHA-256 校验值,把下载文件比对一下,确定文件在传输过程中没有被破坏:
sha256sum jdk-8u232-linux-aarch64.tar.gz输出的哈希值和官网公布的值不一致,说明文件不完整或者被篡改,别用。这个习惯对所有软件安装都适用,尤其是从非官方渠道下载的文件。
3. 解压安装与环境变量配置
3.1 目录规划:把 JDK 放到哪里更合理
解压之前先想好安装目录。Linux 下常见的选择是/usr/local/java或者/opt/java。我习惯用/usr/local/java,因为这个目录通常用来放本机编译安装的软件,符合 FHS(文件系统层次结构标准)的习惯。生产环境里建议把 JDK 放在独立分区或磁盘上,避免系统分区满了影响运行,这个属于运维层面的考量,但提前规划不亏。
解压命令很简单:
sudo mkdir -p /usr/local/java sudo tar -zxvf jdk-8u232-linux-aarch64.tar.gz -C /usr/local/java/解压之后,/usr/local/java下会多出一个jdk1.8.0_232目录。这个目录名是固定的,是 Oracle JDK 打包时的内部命名。为了避免以后升级版本时到处改路径,我习惯再加一个软链接:
cd /usr/local/java sudo ln -s jdk1.8.0_232 jdk8这样JAVA_HOME可以直接指向/usr/local/java/jdk8,后面切换到其他 8u 版本时,只需要把软链接重新指一下,环境变量完全不用动。
3.2 JAVA_HOME、PATH、CLASSPATH 的配置细节
环境变量配置是新手最容易出问题的地方。先说结论:JAVA_HOME必须配,PATH必须配,CLASSPATH在绝大多数场景下可以不配。早年教程里爱写CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar,那是老黄历了。JDK 8 里这些 jar 已经不需要手动加进 classpath,加上去反而可能引发一些奇怪的类加载问题。如果你只是运行普通的 Java 程序,CLASSPATH配成.(当前目录)甚至不配都行。
推荐的做法是在/etc/profile.d/下新建一个独立的脚本文件,不要直接改/etc/profile或者~/.bashrc。原因很简单:/etc/profile.d/下的脚本会在用户登录时被自动加载,独立文件便于管理和卸载,不会跟其他软件的配置产生冲突。
sudo vim /etc/profile.d/java8.sh写入以下内容:
export JAVA_HOME=/usr/local/java/jdk8 export PATH=$JAVA_HOME/bin:$PATH保存后执行:
source /etc/profile.d/java8.sh注意PATH的拼接顺序:$JAVA_HOME/bin要放在前面,这样系统会优先使用我们配置的 JDK。有些机器上预装了 OpenJDK,路径在/usr/bin/java,如果你的PATH里/usr/bin排在前面,java -version出来的可能还是旧版本,这就是很多“我明明装好了为什么版本不对”问题的根源。
3.3 用 alternatives 管理系统默认 JDK
如果你所在的机器上同时存在多个 JDK,或者你希望让整个系统的所有用户都能稳定使用这个 JDK,推荐用update-alternatives来做管理。这套机制是 Debian/Ubuntu 系列发行版的标准做法,它会维护一个符号链接,指向当前选中的 JDK。
注册刚才安装的 JDK:
sudo update-alternatives --install /usr/bin/java java /usr/local/java/jdk1.8.0_232/bin/java 1 sudo update-alternatives --install /usr/bin/javac javac /usr/local/java/jdk1.8.0_232/bin/javac 1然后查看当前选中状态:
sudo update-alternatives --config java如果系统里还有其他 JDK,会在这里列出所有候选项,输入编号即可切换。这个方式比手动改PATH更优雅,因为它把“默认 JDK”的决定权统一交给了系统,而不是依赖某个用户的 shell 配置。不过要注意,update-alternatives只管理/usr/bin/java这个入口,JAVA_HOME环境变量它管不到——如果你的程序是通过读取JAVA_HOME来找 JDK 的,仍需单独配置。
4. 验证安装与实测运行
4.1 命令行验证三连
配置完环境变量,第一件事就是验证。执行下面三条命令:
java -version javac -version echo $JAVA_HOME正常输出应该是这样:
java version "1.8.0_232" Java(TM) SE Runtime Environment (build 1.8.0_232-b09) Java HotSpot(TM) 64-Bit Server VM (build 25.232-b09, mixed mode)注意Java HotSpot(TM) 64-Bit Server VM这一行,说明你运行的是 64 位的 HotSpot 虚拟机。javac -version输出javac 1.8.0_232。echo $JAVA_HOME输出/usr/local/java/jdk8。
如果你是在图形界面的 Linux 上装,别忘了新开的终端才会重新加载配置文件,已经开着的旧终端里环境变量可能还是旧的。要么重开终端,要么手动source一下。
4.2 一个最小测试程序跑通全流程
光看版本号还不够,写个测试程序跑一下,确认编译和运行环节都没问题。在任意目录下创建HelloAarch64.java:
public class HelloAarch64 { public static void main(String[] args) { System.out.println("Hello, aarch64 JDK 8u232!"); System.out.println("os.arch: " + System.getProperty("os.arch")); System.out.println("java.version: " + System.getProperty("java.version")); } }然后编译并运行:
javac HelloAarch64.java java HelloAarch64输出类似:
Hello, aarch64 JDK 8u232! os.arch: aarch64 java.version: 1.8.0_232到这里,整个安装配置流程就算真正跑通了。os.arch输出aarch64说明 JVM 确实运行在 ARM 64 位环境下,java.version确认了版本号。这个最小验证程序建议保留,以后排查“JDK 是不是有问题”时可以直接复用。
5. 常见问题与排查实战
5.1 问题速查表
这一段是给“装完发现不对劲”的人准备的。我把这几年的实操经验整理成一个表格,按症状、原因、解决办法排列,方便你对照排查。
| 症状 | 可能原因 | 解决办法 |
|---|---|---|
java: command not found | PATH 未配置或未生效 | 检查/etc/profile.d/java8.sh内容,重新source或开新终端 |
cannot execute binary file: Exec format error | 架构不匹配 | uname -m确认真实架构,换成对应的linux-aarch64或linux-x64包 |
java -version显示的版本不是 8u232 | PATH 顺序不对,系统里有旧 JDK | 用which java查看实际路径,调整 PATH 顺序或用update-alternatives切换 |
解压后找不到jdk1.8.0_232目录 | 解压命令使用了错误的参数 | 检查 tar 包内容:`tar -tzf jdk-8u232-linux-aarch64.tar.gz |
javac: command not found | 只注册了 java 没注册 javac | 补上update-alternatives --install /usr/bin/javac ... |
程序启动报UnsupportedClassVersionError | 编译版本与运行版本不一致 | 确认javac -version和java -version一致,重新编译 |
其中Exec format error出现频率最高,而且最容易让人摸不着头脑。这个报错其实不是“文件损坏”,而是内核在加载可执行文件时发现它的格式和当前架构不匹配。x86_64 的二进制在 aarch64 上跑,或者反过来,都会报这个错。遇到它先别急着重装,file命令看一下可执行文件的架构,往往一眼就能定位。
5.2 多版本 JDK 共存与切换
实际工作中,一台机器上装两个甚至三个 JDK 是很常见的事。比如系统里原本有 OpenJDK 11,新项目要求 JDK 8,再后来又要 JDK 17。这时候建议彻底放弃“改JAVA_HOME环境变量”这种笨办法,用update-alternatives统一管理。
把每个版本的 java 和 javac 都注册进去,然后随时切换:
sudo update-alternatives --config java sudo update-alternatives --config javac这个方式有一个天然的坑:JAVA_HOME不会跟着变化。很多应用(比如 Maven、Gradle、Tomcat)启动脚本会优先读取JAVA_HOME。我自己常用的做法是写一个小的切换脚本,放在/usr/local/bin下,比如switch-jdk8.sh和switch-jdk11.sh,内容就是重新设置/etc/profile.d/java.sh里的软链接目标,然后提示用户重新登录。这种方式在团队协作的服务器上尤其好用,因为每个人打开的 shell 可能已经加载了不同的环境变量,谁也说不清谁是对的,统一用脚本切换至少能保证文档可追溯。
5.3 关于 glibc 和系统依赖的补充
最后补充一个不太容易被注意到的问题:Oracle JDK 8u232 的 aarch64 包对系统的 glibc 版本有最低要求,通常是 glibc 2.17 或更新版本。如果你的系统是特别老的发行版,比如 CentOS 6 的 ARM 版本,可能装不上这个 JDK。排查方法很简单,遇到version GLIBC_2.17 not found之类的报错,说明系统 glibc 太旧,要么升级系统,要么换用更早的 JDK 版本。
我个人在实际部署中的体会是:JDK 安装这件事,90% 的问题都出在“架构不匹配”和“环境变量没生效”这两个点上,而不是 JDK 本身。所以每次在新的 aarch64 机器上装完,我都会先把uname -m输出、java -version输出、echo $JAVA_HOME输出整整齐齐地贴到笔记里,作为环境基线记录。以后机器出问题,第一件事就是拿基线比对。最后再分享一个小技巧:如果你要在一批同样的 aarch64 机器上批量部署,先把jdk1.8.0_232目录整体打成 tar 包,分发到目标机器后直接解压,再执行一遍 alternatives 注册,比每台机器都重新走一遍下载安装流程省事得多。
本文还有配套的精品资源,点击获取