Eclipse Temurin OpenJDK 8在Linux上的安装配置与多版本切换实践
2026/9/16 7:03:53 网站建设 项目流程

简介:这是一份面向Linux x64平台的Eclipse Temurin发行版OpenJDK 8更新包(8u312b07),适合需要稳定、TCK认证Java运行环境的开发与运维人员。压缩包共445个文件,约98.24MB,内含120个class字节码、91个java源码、39个so动态库及25个jar包,辅以properties、xml、js等配置与脚本资源,构成一套完整的JDK工具链,解压后即可配置JAVA_HOME使用。已有1190人学习下载,足见其在普通Java开发与容器部署场景中的参考价值。资源不仅自带javac、java、keytool等常用命令,还包含jmap、jstack、jcmd等JVM诊断工具,以及JFR、HSDB等性能分析组件,可帮助读者在Linux服务器上完成从应用编译、运行到线上排障的全流程操作;附带的man手册与安全证书也便于离线环境下的初始化配置。

1. Eclipse Temurin 的 OpenJDK8U 文件名:一次完整的发行版选型

OpenJDK8U-jdk_x64_linux_hotspot_8u312b07这个文件名里藏着完整的选型信息:OpenJDK 8 的 Update 版本、完整 JDK 而非 JRE、x64 Linux、HotSpot VM、8u312 的第 7 个构建。当生产环境需要 Java 8 时,Oracle JDK 8 的商业授权在 2019 年后收紧,Eclipse Temurin 作为 Adoptium 项目的默认构建,成为 Linux x64 上最常见的免费替代。8u312b07 是 2021 年 10 月的 CPU(关键补丁更新),至今仍在大量旧系统中运行。这篇文章以这个版本为基线,从下载验签、安装配置到多版本切换走完整条路径,操作可以直接复制到你的 Linux 服务器上执行。

2. 下载与验签:用 Adoptium API 取回 Temurin 8u312b07 并核对 SHA-256

2.1 文件名拆解:每个字段对应哪个发布渠道

Temurin 的二进制命名规则在 8 系列里是固定的,理解它才能准确地用 API 或镜像站取件:

文件名片段含义对应 Adoptium API 参数
OpenJDK8UOpenJDK 8 Update 系列feature_version=8
jdk完整 JDK(含 javac、jar、jlink)image_type=jdk
x6464 位 x86 架构architecture=x64
linuxLinux 平台os=linux
hotspotHotSpot VM 实现jvm_impl=hotspot
8u312b078 系列 312 更新,build 07jdk8u312-b07

命名里的b07对应 API 版本字符串里的-b07,在 Adoptium 的 release tag 里写成jdk8u312-b07。检索下载链接时,用 GitHub 的adoptium/temurin8-binariesrelease 页面直接定位到该 tag,比在官网首页逐层点击更精准——这个仓库只有 8 系列,文件名格式与8u312b07一一对应,不会有 11/17 的干扰项。

2.2 curl 下载与 checksum 比对

Adoptium 提供了一套版本化下载 API,精确指定版本时用v3/binary/version路径,302 重定向到 CDN 实际文件:

# 精确到 8u312b07 的下载请求 curl -L -o OpenJDK8U-jdk_x64_linux_hotspot_8u312b07.tar.gz \ "https://api.adoptium.net/v3/binary/version/jdk8u312-b07/linux/x64/jdk/hotspot/normal/eclipse" # 拿同一构建的 SHA-256 校验值(assets API 返回 JSON) curl -s "https://api.adoptium.net/v3/assets/version/jdk8u312-b07/linux/x64/jdk/hotspot/normal/eclipse" \ | jq -r '.[].binary.package.checksum' # 本地计算比对 sha256sum OpenJDK8U-jdk_x64_linux_hotspot_8u312b07.tar.gz

-L参数跟随 API 的 302 跳转,不加会拿到空文件。checksum字段是 8u312 之前的版本在 API 里就能直接取到,对比时注意该字段是纯十六进制字符串,不需要二次转码。sha256sum输出的第一列与 API 返回值一致即通过校验。删除 assets API 里的.sig文件路径——Temurin 所有 GA 版本都发布 GPG 签名,严格的生产环境导入 Adoptium 公钥后再验证:

# 导入 Adoptium 签名公钥(从官网 keys 页面获取) curl -s https://adoptium.net/keys | gpg --import - # 验证签名(需要同时下载对应的 .sig 文件) gpg --verify OpenJDK8U-jdk_x64_linux_hotspot_8u312b07.tar.gz.sig \ OpenJDK8U-jdk_x64_linux_hotspot_8u312b07.tar.gz

提示:只做 SHA-256 校验能发现传输损坏,做不了防篡改。内网镜像或公司源拿到的包,建议至少做一次完整的 GPG 验证,密钥指纹要和 Adoptium 官方文档上公布的一致。

2.3 下载后别急着解压:确认 glibc 兼容性

8u312b07 的通用构建面向 glibc 2.12 以上的系统(对应 CentOS 6 之后的发行版)。如果部署目标是更老的 RHEL 5/6 兼容层,或某些国产 Linux 的裁剪版本,ldd --version低于 2.12 时需要改用-linux-x64的 legacy 构建,而不是这个标准包。判定方法是在目标机器上执行:

ldd --version | head -1

输出形如ldd (GNU libc) 2.17,只要不低于 2.12 就能正常使用通用版。这部分兼容性问题在8u312b07年代还不突出,但如果你把同样的安装脚本升级到 Temurin 17 的构建,这个检查就成为必需项——17 的通用构建要求 glibc 2.17 起步,很多老系统栽在这一步而不是 Java 本身。

3. Linux 安装与配置:从解压到 JAVA_HOME、update-alternatives 双通道一致

3.1 目录规划与解压:为什么不用 /usr/lib/jvm

先约定目录再动手。大部分 Linux 发行版默认把 JDK 放在/usr/lib/jvm,但那里通常被系统自带的 OpenJDK 或包管理器安装的版本占据,一旦手动解压的 Temurin 同名文件混入,alternatives的链路就会变得混乱。我一般用独立的/opt/java目录来管理手动安装的 JDK:

mkdir -p /opt/java tar -zxf OpenJDK8U-jdk_x64_linux_hotspot_8u312b07.tar.gz -C /opt/java mv /opt/java/jdk8u312-b07 /opt/java/temurin-8u312

tar -zxf解压后目录名是jdk8u312-b07,这正是构建的 bundle 名。重命名为temurin-8u312有两个原因:一是目录名称带上发行版标识,java -version显示的是 Temurin 而目录还叫 jdk8u312 会造成歧义;二是后续升级到 8u322、8u332 时,/opt/java/temurin-8u322新目录独立存在,旧目录直接删除即可,回滚也只需要改软链接。

3.2 环境变量写入 /etc/profile.d:登录 shell 的加载时机

JAVA_HOME配置最常见的失败点是写进了~/.bashrc,但服务由 systemd 拉起时读不到;或者写进/etc/profile,但非交互 SSH 执行命令时也不会加载。正确做法是独立文件放在/etc/profile.d/目录下,登录 shell 启动时由/etc/profile统一 source:

cat > /etc/profile.d/temurin8.sh <<'EOF' export JAVA_HOME=/opt/java/temurin-8u312 export PATH=$JAVA_HOME/bin:$PATH export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar EOF

CLASSPATH这一行在 JDK 9 之后已经没有意义(模块化后dt.jartools.jar被移除),但在 JDK 8 的场景下,旧项目里的javac编译或java运行时如果不设CLASSPATH,会默认以当前目录为 classpath,遇到依赖缺失时误报类找不到。手动设置后,-classpath参数依然优先,不会覆盖显式指定的依赖路径。

3.3 update-alternatives 注册:让系统命令指向 Temurin

环境变量只影响登录后的 shell,/usr/bin/java这类全局限定路径不被PATH控制,必须通过update-alternatives注册:

update-alternatives --install /usr/bin/java java /opt/java/temurin-8u312/bin/java 8312 update-alternatives --install /usr/bin/javac javac /opt/java/temurin-8u312/bin/javac 8312 update-alternatives --install /usr/bin/jar jar /opt/java/temurin-8u312/bin/jar 8312 # 确认注册结果并手动设置默认版本 update-alternatives --config java

优先级8312是自定义数字,规则是「越大越优先」。用8+312拼接,既满足优先级排序,又能一眼看出对应哪个版本。只注册java不够——javacjar是独立链接,编译阶段调用的是javac,不注册的话会出现java -version显示 8 而javac -version还是系统旧版的「半切换」状态。

注册命令作用对象常见遗漏后果
javaJVM 启动器java -version版本不对
javacJava 编译器Maven/Gradle 编译期仍用旧 JDK
jar打包工具打包工具链版本不一致
jstack等工具JDK 诊断工具线程转储工具路径混用

3.4 国产 Linux 与 ARM 架构的注意点

\_x64\_只适配 x86_64 指令集。部署到飞腾、鲲鹏这类 ARM 平台时,必须下载aarch64构建,文件名变为OpenJDK8U-jdk_aarch64_linux_hotspot_8u312b07.tar.gz。判断当前机器架构用uname -m,输出aarch64就换架构参数,不要只看系统的品牌名——部分国产系统会伪装成 x86 的发行版名称,uname -m不会骗人。Temurin 8 在国产化适配中表现稳定,因为 8 系列的 OpenJDK 社区补丁合并周期长,较新的 glibc 和内核都能兼容。

4. 多 JDK 共存:用 update-alternatives 管理 OpenJDK 8 与 17 的切换

4.1 双版本注册与切换命令

一台机器只装一个 JDK 的情况在后端开发中越来越少。旧系统跑 Spring Boot 2.x 需要 Java 8,新服务用 Spring Boot 3.x 强制 Java 17。Temurin 8 保留,再装一个 Temurin 17,注册在同一套alternatives体系下:

# 先装好 Temurin 17 并注册(目录约定与 8u312 相同) update-alternatives --install /usr/bin/java java /opt/java/temurin-17/bin/java 1732 update-alternatives --install /usr/bin/javac javac /opt/java/temurin-17/bin/javac 1732 update-alternatives --install /usr/bin/jar jar /opt/java/temurin-17/bin/jar 1732 # 切换当前默认 JDK update-alternatives --config java

切换后执行java -version,显示openjdk version "1.8.0_312"还是openjdk version "17.0.x"即切换结果。优先级数字1732对应 17 系列的 32 更新版本,这里的数字大小同时影响自动选择的权重——系统里同时有 8312 和 1732 时,新注册的 17 会成为默认,除非用--config手动改回。注意:update-alternatives --config java只改/usr/bin/java的软链接,改的是 shell 命令解析;JAVA_HOME是另一个独立通道,不会跟着变。

4.2 Maven、Gradle 读的是 JAVA_HOME,不是 alternatives

这是多版本切换最容易踩的坑。update-alternatives/usr/bin/java切到了 17,但echo $JAVA_HOME仍然指向/opt/java/temurin-8u312。Maven 的mvn -version会以JAVA_HOME优先,直接导致编译还是 JDK 8 环境:

mvn -version # 输出里 Java version: 1.8.0_312, vendor: Eclipse Temurin # 哪怕 /usr/bin/java 已经是 17

因此版本切换要双通道同步。写一个 shell 函数放进/etc/profile.d/java_env.sh,把两个版本的环境切换封装成命令:

function usejdk() { case "$1" in 8) export JAVA_HOME=/opt/java/temurin-8u312 ;; 17) export JAVA_HOME=/opt/java/temurin-17 ;; *) echo "Usage: usejdk 8|17" return 1 ;; esac export PATH=$JAVA_HOME/bin:$PATH java -version 2>&1 | head -1 }

函数定义要放在/etc/profile.d/下,并且文件后缀必须是.sh。执行usejdk 17后,JAVA_HOMEPATH同步指向 Temurin 17,mvn -version立即跟着变。如果用的是 zsh,函数定义写在~/.zshrc里,语法不变,但注意 bash 数组和case语句的写法在两种 shell 里都能兼容。

4.3 软链接方案与 alternatives 方案的边界

部分团队不用update-alternatives,直接改/opt/java/current软链接指向:ln -sfn /opt/java/temurin-17 /opt/java/current,然后把JAVA_HOME定为/opt/java/current。这个方案更直观,但有两个问题:一是alternatives里的/usr/bin/java如果没跟着改,java命令和JAVA_HOME/bin/java会指向不同版本;二是软链接本身不参与发行版的包管理依赖,rpm -q查不到任何关联信息。

我的做法是两者结合:/usr/bin/java交给alternatives管理,保证系统级命令正确;JAVA_HOME写成具体目录而非软链接,避免软链接被意外替换导致连锁错误。这样切换版本时,usejdk函数改环境变量,alternatives --config改系统命令,两条链路互不干扰。

5. 验证与排错:看懂 java -version 输出,处理 javaws 缺失与配置失败

部署完成的最后一件事不是跑业务,而是用最小命令验证整条链路。下面的命令序列覆盖了 shell 解析、软链接指向和 JVM 启动三个层面:

echo "JAVA_HOME=$JAVA_HOME" command -v java readlink -f "$(command -v java)" java -version 2>&1 ssh localhost 'echo $JAVA_HOME'

command -v java显示 shell 在PATH中解析到的实际路径;readlink -f穿透/etc/alternatives/java的软链接显示最终目标。如果readlink -f的输出指向/opt/java/temurin-8u312/bin/java,说明 system 命令链路正确。最后一条ssh localhost模拟非交互登录:如果输出空行,说明/etc/profile.d/temurin8.sh没在非交互 shell 中加载,这是 systemd service 里ExecStart读不到JAVA_HOME的典型原因,解决方式是在 service unit 的[Service]段加Environment=JAVA_HOME=/opt/java/temurin-8u312

java -version的正确输出是:

openjdk version "1.8.0_312" OpenJDK Runtime Environment (Temurin)(build 1.8.0_312-b07) OpenJDK 64-Bit Server VM (Temurin)(build 25.312-b07, mixed mode)

看到Temurin字样即可确认是 Eclipse Temurin 构建而非 Oracle 或系统自带 OpenJDK。build 1.8.0_312-b07与文件名里的8u312b07完全对应。如果输出里出现i38632-Bit,说明下载的是 32 位构建,与标题里的x64不符,需要重新换包。最后检查javaws:8u312 版本还保留 Java Web Start,但从 8u331 开始 Temurin 移除了javaws。生产环境有 JNLP 启动的遗留系统时,升级前先执行which javaws确认依赖,没有的版本直接放弃或先测试替代方案。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询