
简介jdk-24_linux-x64_bin.tar.gz 是面向 Java 开发者、运维人员及高校学生的 Linux 64 位 JDK 24 官方二进制发行包解压即可使用无需额外安装步骤适合搭建本地开发环境、运行 Java 应用或进行新版本特性验证。压缩包共 405 个文件约 231.9MB内容以 71 个 jmod 模块、71 个 license 与 70 个 copyright 声明文件为主并包含 40 个 so 本地库、45 个 md 说明文档及若干 h 头文件、properties 配置、policy 策略与 template 模板文件同时提供 javac、java、jshell、jpackage、jlink、jcmd、jfr、jconsole 等完整命令行工具覆盖编译、打包、诊断与性能分析等场景。目前已有 116 人学习下载。该资源目录结构规范bin、lib、conf、include 等模块划分清晰便于快速定位可执行程序与依赖库适合需要稳定运行环境或研究 JDK 内部模块化机制的用户参考使用。1. jdk-24_linux-x64_bin.tar.gz 到底是什么从文件名拆出四个关键信息拿到jdk-24_linux-x64_bin.tar.gz这个文件名很多人第一反应是「又一个压缩包」随手tar -zxvf解压完事结果环境变量配错、java -version报找不到命令回头怀疑包坏了。其实这个文件名本身就是一份说明书jdk-24是版本linux是目标系统x64是 CPU 架构bin表示这是可执行二进制发行版.tar.gz是打包压缩格式。把这五段拆清楚后面解压、配环境变量、多版本共存才有依据。这篇讲的就是怎么在 Linux 上把这个 tar.gz 包从下载到跑通覆盖解压路径选择、环境变量配置、多 JDK 版本切换、以及国产 Linux 发行版上的常见翻车点。适合刚接手一台 Linux 服务器要装 JDK 的后端和运维也适合手上已经有一堆 tar.gz 却总配不对JAVA_HOME的人。下面按「先看懂包、再动手装、最后避坑」的顺序走一遍命令都能直接抄。2. 解压前先想清楚路径、权限和架构三件事2.1 为什么 tar.gz 版 JDK 比包管理器安装更值得选Linux 上装 JDK 常见两条路一条是apt install openjdk-xx-jdk或yum install java-xx-openjdk交给包管理器另一条就是拿官方 tar.gz 手动解压。两者不是谁替代谁而是场景不同。包管理器装出来的 JDK路径固定在/usr/lib/jvm/下面升级卸载一条命令省心。但它有两个硬伤一是版本受发行版仓库限制比如某些国产 Linux 仓库里最高只到 JDK 17你想要 JDK 24 就得等仓库更新二是多个项目要不同 JDK 时包管理器装的版本切换起来容易和系统默认搅在一起。tar.gz 版的好处是「绿色」解压到哪个目录你说了算删掉就是卸载不污染系统包数据库。多版本共存时只要切换JAVA_HOME和PATH就能换 JDK这对同时维护 JDK 8 老项目和 JDK 24 新项目的团队特别实用。代价是你得自己管环境变量配错了就是command not found。提示生产服务器上如果只跑一个固定版本的服务包管理器更省事如果要做多版本切换或仓库版本太旧tar.gz 是更稳的选择。2.2 解压路径怎么选/usr/local 还是 /opt路径选择看着小事实际影响后面所有配置。我一般把 JDK 放在/usr/local/或/opt/下两者都是放第三方软件的惯例目录区别在于习惯/usr/local偏「本地编译安装的软件」/opt偏「独立第三方应用」。选哪个都行关键是全团队统一别这台机器/usr/local那台/opt脚本里写死路径就会翻车。先确认架构别下错包。x64对应的是 x86_64 架构用下面命令核对uname -m # 输出 x86_64 说明是 x64 架构可以用这个包 # 如果输出 aarch64说明是 ARM64得换 arm64 的包确认无误后创建目录并解压。假设包已经传到/tmp# 创建统一存放目录-p 保证父目录不存在时一起建 sudo mkdir -p /usr/local/java # 解压到指定目录-C 指定解压目标-z 处理 gzip-x 解压-v 显示过程-f 指定文件 sudo tar -zxvf /tmp/jdk-24_linux-x64_bin.tar.gz -C /usr/local/java/ # 查看解压出来的目录名通常是 jdk-24 或 jdk-24.x.x ls /usr/local/java/这里有个容易忽略的点解压出来的目录名不一定正好是jdk-24可能是带小版本号的jdk-24.0.1之类。后面配JAVA_HOME必须用真实目录名所以先ls看一眼别凭记忆写。参数说明-C是很多人漏掉的不加它就会解压到当前目录结果 JDK 散落在你执行命令的地方-z针对.tar.gz如果是.tar.xz要换成-J。解压完建议把目录属主改一下避免普通用户没权限读# 把 JDK 目录属主改成当前用户和用户组$USER 是当前登录用户名 sudo chown -R $USER:$USER /usr/local/java/jdk-242.3 环境变量配在哪/etc/profile 还是 ~/.bashrc环境变量配错是「jdk环境变量配置失败」这类搜索词背后的高频问题。核心就三个变量JAVA_HOME指向 JDK 根目录PATH把bin加进去CLASSPATH现在基本不用手动配了。配置文件选哪个取决于生效范围配置文件生效范围适用场景/etc/profile所有用户登录时加载服务器统一环境推荐/etc/profile.d/*.sh所有用户模块化管理多软件环境变量最推荐~/.bashrc当前用户交互式 shell个人开发机~/.bash_profile当前用户登录时加载个人开发机生产服务器我一般用/etc/profile.d/下单独建一个jdk.sh好处是环境变量按软件分文件以后卸载 JDK 直接删文件不会把/etc/profile改得乱七八糟。# 新建 JDK 环境变量文件 sudo tee /etc/profile.d/jdk.sh /dev/null EOF # JDK 根目录必须和实际解压目录名一致 export JAVA_HOME/usr/local/java/jdk-24 # 把 java、javac 等命令加入 PATH放在前面优先于系统自带 export PATH$JAVA_HOME/bin:$PATH EOF # 给文件加执行权限部分系统要求 profile.d 下脚本可执行 sudo chmod x /etc/profile.d/jdk.sh # 让当前 shell 立即生效不用重新登录 source /etc/profile.d/jdk.sh逻辑说明PATH里$JAVA_HOME/bin放在$PATH前面是为了让这个 JDK 优先于系统可能自带的旧版本。如果放后面java -version可能还是老版本这是「配了没生效」最常见的原因。source只对当前终端生效新开的终端会自动加载profile.d但已经开着的旧终端不会所以要么source要么重开。验证java -version # 应输出 openjdk version 24 之类 echo $JAVA_HOME # 应输出 /usr/local/java/jdk-24 which java # 应输出 /usr/local/java/jdk-24/bin/java三个命令都对上才算真正配好。只看java -version不够因为系统可能还有别的 java 在 PATH 里。3. 多版本共存与切换别让 JAVA_HOME 打架3.1 用 alternatives 还是手动切环境变量一台机器上同时有 JDK 8、JDK 17、JDK 24 是常态。切换方式有两种一是update-alternatives二是手动改JAVA_HOME。前者是 Debian/Ubuntu 系的管理工具能统一管理java、javac等命令的软链接后者靠脚本改环境变量跨发行版通用。update-alternatives的坑在于它只管命令软链接不管JAVA_HOME。很多构建工具Maven、Gradle读的是JAVA_HOME而不是java命令所以只切 alternatives 会出现「命令行 java 是 24但 Maven 还用 17」的诡异现象。我一般两个都管alternatives 管命令环境变量管JAVA_HOME。# 注册 JDK 24 到 alternatives优先级设高一点 sudo update-alternatives --install /usr/bin/java java /usr/local/java/jdk-24/bin/java 2400 sudo update-alternatives --install /usr/bin/javac javac /usr/local/java/jdk-24/bin/javac 2400 # 交互式选择默认版本 sudo update-alternatives --config java3.2 写一个切换脚本把 JAVA_HOME 一起换掉手动改JAVA_HOME每次编辑文件太麻烦我习惯写个小函数放进~/.bashrc一条命令切换# 追加到 ~/.bashrc switch_jdk() { case $1 in 8) export JAVA_HOME/usr/local/java/jdk-8 ;; 17) export JAVA_HOME/usr/local/java/jdk-17 ;; 24) export JAVA_HOME/usr/local/java/jdk-24 ;; *) echo 用法: switch_jdk {8|17|24}; return 1 ;; esac export PATH$JAVA_HOME/bin:$PATH echo 已切换到 JDK $1: $JAVA_HOME java -version }逻辑说明函数根据参数设置JAVA_HOME再重建PATH。注意这里PATH会不断叠加旧路径长时间切换可能让PATH变长严谨点可以先从PATH里剔除旧的 JDK 路径再拼但日常用影响不大。参数就是版本号改脚本里的路径即可适配你自己的目录结构。注意切换脚本只影响当前终端。如果服务是用 systemd 启动的systemd 不读~/.bashrc得在 service 文件里显式写EnvironmentJAVA_HOME...这是「脚本里切了但服务还是老版本」的典型原因。3.3 验证多版本是否真的隔离切完别只看java -version要确认构建工具也认了新版本# 查看 Maven 实际使用的 JDK mvn -version # 输出里的 Java version 应和当前 JAVA_HOME 一致 # 查看 Gradle 使用的 JDK gradle -version如果mvn -version显示的 Java 版本和java -version不一致八成是JAVA_HOME没跟着切或者 Maven 的jvm.config里写死了路径。这时候回去查echo $JAVA_HOME基本能定位。4. 国产 Linux 与常见发行版上的安装差异4.1 麒麟、统信等国产系统上的注意点国产 Linux如麒麟 V10、统信 UOS大多基于某个主流发行版二次开发tar.gz解压和配环境变量的流程完全一样差异主要在两点一是系统可能预装了自带的 OpenJDKPATH里已经有java你配的新 JDK 如果没放前面就会被盖住二是部分系统对/usr/local的权限管得严普通用户写不进去得用sudo。处理办法很直接先查系统自带的 java 在哪再决定是覆盖还是共存。# 查看系统所有 java 可执行文件位置 which -a java # 查看系统自带 JDK 的 JAVA_HOME 线索 readlink -f $(which java)如果自带 JDK 在/usr/lib/jvm/下而你不想动它就把自己的 JDK 路径放在PATH最前面靠优先级压过去。如果系统强制要求用自带版本那就别硬刚用alternatives或直接改系统默认。4.2 不同发行版的 profile 加载差异/etc/profile.d/在大多数发行版都支持但加载时机有细微差别。CentOS/RHEL 系和 Debian/Ubuntu 系都会在登录时遍历这个目录但如果你用的是非登录 shell比如ssh执行单条命令、su不带-可能不加载profile。# 非登录 shell 测试看环境变量是否生效 ssh userhost echo $JAVA_HOME # 如果为空说明非登录 shell 没加载 profile.d解决办法对需要在非登录 shell 里用 JDK 的场景把环境变量同时写进~/.bashrc或者在脚本里显式source /etc/profile.d/jdk.sh。这是自动化部署脚本里经常踩的坑——手动登录测试没问题CI/CD 跑起来就找不到 java。4.3 权限与 SELinux 的干扰在开启了 SELinux 的系统上把 JDK 解压到非标准目录后执行java可能被拦。现象是命令存在但执行报权限拒绝。排查# 查看 SELinux 状态 getenforce # 如果是 Enforcing看审计日志 sudo ausearch -m avc -ts recent | grep java如果确认是 SELinux 拦截正规做法是给 JDK 目录打上正确标签而不是直接关 SELinux# 恢复目录默认安全上下文 sudo restorecon -Rv /usr/local/java/5. 避坑与排查五条血泪经验5.1 java -version 显示旧版本现象配完环境变量java -version还是系统自带的旧版本。 原因PATH里新 JDK 的bin没放在最前面或者当前终端没source新配置。 解决echo $PATH看顺序确认$JAVA_HOME/bin在最前执行source /etc/profile.d/jdk.sh或重开终端用which -a java列出所有 java 确认优先级。5.2 JAVA_HOME 指向了 bin 目录现象Maven 报JAVA_HOME is set to an invalid directory。 原因JAVA_HOME写成了/usr/local/java/jdk-24/bin多写了一层bin。 解决JAVA_HOME必须指向 JDK 根目录不是bin。改成/usr/local/java/jdk-24PATH里再拼$JAVA_HOME/bin。5.3 解压后目录名和预期不一致现象JAVA_HOME配的路径不存在source后命令全失效。 原因解压出来的目录带小版本号比如实际是jdk-24.0.1你写的是jdk-24。 解决ls /usr/local/java/看真实目录名用真实名字配JAVA_HOME。或者解压后重命名成固定名字方便脚本统一。5.4 非登录 shell 里环境变量丢失现象手动登录能用 javassh host java -version或定时任务里报找不到命令。 原因非登录 shell 不加载/etc/profile和profile.d。 解决把环境变量写进~/.bashrc或在脚本开头显式source /etc/profile.d/jdk.sh。systemd 服务则在 unit 文件里写Environment。5.5 磁盘空间不足导致解压中断现象解压到一半报No space left on device目录残缺。 原因JDK 解压后体积不小/usr/local所在分区空间不够。 解决df -h /usr/local先看剩余空间不够就换分区或清理。解压中断后别在残缺目录上继续配删掉重新解压否则会出现各种找不到类的玄学错误。6. 进阶把 JDK 安装写进自动化脚本并做校验手动装一次不难难的是几十台机器保持一致。我一般把安装过程写成一个幂等脚本先检查目标版本是否已存在存在就跳过不存在才下载解压配环境。这样重复执行不会出问题。#!/bin/bash set -euo pipefail JDK_VERSIONjdk-24 JDK_DIR/usr/local/java/${JDK_VERSION} TARBALL/tmp/jdk-24_linux-x64_bin.tar.gz # 幂等检查目录已存在且 java 可执行就退出 if [ -x ${JDK_DIR}/bin/java ]; then echo JDK 已安装: ${JDK_DIR} exit 0 fi # 校验压缩包存在 if [ ! -f ${TARBALL} ]; then echo 找不到安装包: ${TARBALL} exit 1 fi # 解压并配置 sudo mkdir -p /usr/local/java sudo tar -zxf ${TARBALL} -C /usr/local/java/ # 写环境变量文件 sudo tee /etc/profile.d/jdk.sh /dev/null EOF export JAVA_HOME${JDK_DIR} export PATH\$JAVA_HOME/bin:\$PATH EOF sudo chmod x /etc/profile.d/jdk.sh # 校验安装结果 source /etc/profile.d/jdk.sh java -version echo JAVA_HOME${JAVA_HOME}逻辑说明set -euo pipefail让脚本遇错即停避免半途失败还继续跑。幂等检查放在最前面重复执行直接退出适合放进配置管理工具反复调用。tee写文件时用EOF不带引号是为了让$JAVA_HOME在写入时展开成实际路径如果带引号EOF变量会原样写进去运行时才展开两种都行看你要固定路径还是动态路径。参数说明JDK_VERSION和JDK_DIR按实际目录名改TARBALL指向你上传的包路径。校验环节的java -version是最后一道关输出不对就说明前面某步有问题脚本会因set -e在source失败时退出。再补一个校验习惯装完用javac -version也跑一遍。有些精简版包只带 JRE 不带编译器java能跑但javac没有编译项目时才暴露。jdk-24_linux-x64_bin.tar.gz是完整 JDK正常两个都有但校验一下不亏。我自己踩得最深的一次是在一台国产系统上配完环境变量手动登录一切正常结果服务用 systemd 启动死活读不到JAVA_HOME排查半天才发现 systemd 根本不加载profile.d。从那以后凡是服务用的 JDK我都在 unit 文件里显式写死EnvironmentJAVA_HOME...不再赌它读不读 profile。装 JDK 这事没有多高深但细节全在环境变量和加载时机上把这两块吃透基本就不会再翻车。希望帮到你。本文还有配套的精品资源点击获取