JDK 18 Linux 64位压缩包安装教程:环境变量配置与多版本切换
2026/9/13 15:26:41 网站建设 项目流程

简介:这是一份Java 18开发套件的Linux 64位免安装压缩包,面向使用Ubuntu、CentOS等发行版的开发者与运维人员,解决在无图形界面或需快速切换JDK版本时手动安装繁琐的问题。解压即可得到完整JDK目录,按包内附带的配置说明设置JAVA_HOME、path、classpath后即可直接运行java、javac、jshell等命令。资源共387个文件,压缩后约174.31MB,包含71个jmod模块文件、38个so动态链接库、核心可执行命令及其man手册,另附license、copyright等合规文档,结构清晰,便于排查缺失组件或进行裁剪。目前已有876人学习下载。该压缩包适合用于服务器环境初始化、容器镜像构建、内网离线部署,也可作为学习Java 18模块化特性时的干净基础环境,目录布局与官方发布版一致,使用体验接近原生安装。

1. JDK 18 linux 64位 压缩包:解压即装,重点是环境变量

在 Linux 服务器上装一个 64 位的 JDK 18,最省事的方式往往不是 apt/yum,而是直接下载官方 tar.gz 压缩包,解压后把 bin 目录写进 PATH。这个“解压即安装”的流程不依赖发行版仓库,不受包管理器版本策略影响,特别适合需要锁定 JDK 小版本的 CI 构建机、容器镜像,或者只想临时验证某个特性的系统。JDK 18 本身只发布 64 位架构的包,所以“64位”不是选择题;真正要小心的是下载到 aarch64 包、解压目录少了顶层名、环境变量没写进 profile 这类问题。这篇按下载、解压、配置、验证的顺序,把 JDK 18 linux 64 位压缩包的安装流程走完整,并解释每个步骤背后的原因。

2. 下载 JDK 18 的 tar.gz:先确认 Linux 是 x86_64 还是 aarch64

“64 位”三个字在 JDK 18 里几乎成了默认:这个版本不再发布 32 位安装包,所以你平时在 Windows 上纠结的 x86/x64 二选一,在这里换成了 x64 和 aarch64 的选择。x64 对应 Intel/AMD 台式机和常见的云服务器,aarch64 对应 ARMv8 的服务器。在 x86_64 机器上下载了 aarch64 包,解压会成功,但运行/opt/.../bin/java时会直接报 “cannot execute binary file”。因此,下载前的第一件事必须是确认机器架构,而不是看到页面带 64 位就直接点下载。

2.1 用 uname -m 确认架构,避免下错 aarch64 包

先跑下面三句话,确认当前系统是 64 位还是 32 位,以及 CPU 架构是不是 x86_64:

uname -m getconf LONG_BIT lscpu | grep -E 'Architecture|CPU op-mode'

第一行输出x86_64表示 x86 64 位架构,输出aarch64表示 ARM64。第二行得到 64 表示用户态是 64 位,但如果系统是精简容器,这个值有时会给出 32,需要结合uname -a一起看。第三行能看到CPU op-mode: 32-bit, 64-bit,这种输出说明 CPU 支持 64 位,只是内核或用户态未必开了。不要用uname -p判断,它在很多发行版上返回unknown,没有参考价值。

把结果和 JDK 18 压缩包对应起来:

uname -m 输出CPU 平台应该下载的 tar.gz
x86_64Intel / AMD x64jdk-18_linux-x64_bin.tar.gz
aarch64ARMv8 及以上jdk-18_linux-aarch64_bin.tar.gz
i686 / i386老 32 位不能装,JDK 18 没有 32 位包

这套 Linux 常用命令其实适用于所有以压缩包分发的软件,不只是 JDK。确认好架构之后,再进入下载步骤,能省掉后面一整轮排错。

2.2 从官网下载 tar.gz,手动核 sha256

JDK 18 的官方压缩包以jdk-18_linux-x64_bin.tar.gz命名。Oracle 官网的下载页需要先点接受许可协议,不过在已经拿到固定下载地址的情况下,可以在命令行直接用 curl 取:

cd /tmp curl -L -C - -o jdk-18_linux-x64_bin.tar.gz \ https://download.oracle.com/java/18/latest/jdk-18_linux-x64_bin.tar.gz sha256sum jdk-18_linux-x64_bin.tar.gz

-L是跟随重定向,-C -是断点续传,-o强制指定本地文件名。sha256sum会输出一串 64 位十六进制值,把这个值和官网下载页列出的 SHA-256 比对,完全一致再继续。如果是公司内网部署,通常会搭一个 jdk 镜像网站,把同样的文件同步到内网,校验值也应该一致;不一致就说明文件损坏或被动过。

下载页同时还会提供.rpm包,但那个安装方式会写系统文件、注册 RPM 数据库,不属于“解压即可安装”的范畴。这里只认.tar.gz,它才是真正的绿色压缩包。Oracle 的latest链接指向 JDK 18 的最新小版本,比如 18.0.2 之后的修正版,目录名会跟着变,但这种变化不影响压缩包本身的解压逻辑。

2.3 解压前先用 tar -tzf 看顶层目录

拿到压缩包后别急着解压,先看包内顶层目录,避免解压后不知道 JDK 实际被放到了哪一层:

tar -tzf jdk-18_linux-x64_bin.tar.gz | head -5

第一条输出通常是jdk-18.0.2/,这个目录名会在下一步用到。用tar -tzf预检还有一个好处:tar.gz 包内如果是 ASCII 路径,解压时不会出现常见的 linux 解压文件乱码;而 zip 包反而容易出现 GBK/UTF-8 混合文件名问题。看到顶层目录后,下一章的解压命令就能写得更稳。如果是批量部署,建议下载后就把压缩包缓存到/opt/pkg/cache,避免每台机器都去官网拉一次。

3. 解压即安装:把 JDK 18 放进 /opt 并配置环境变量

压缩包解压到/opt是 Linux 上最常见的部署位置,因为普通用户只读/opt,root 统一管理,后续删除也干净。解压本身只有一条 tar 命令,但大多数人卡在两点:解压后的 JDK 目录名带小版本号,导致脚本里路径不好写;环境变量写进了/etc/profile但当前 shell 不生效,误以为安装失败。这一章把这两个点拆开处理。

3.1 用 tar --strip-components=1 固定 JDK 安装目录

我一般会先把 JDK 解压到一个固定的/opt/jdk18,而不是直接保留包内jdk-18.0.2目录。这样可以避免环境变量里写死小版本号,升级时也不怕目录名变化。命令如下:

sudo mkdir -p /opt/jdk18 sudo tar -xzf /tmp/jdk-18_linux-x64_bin.tar.gz -C /opt/jdk18 --strip-components=1 ls -l /opt/jdk18/bin/java

--strip-components=1表示去掉包内第一层目录,也就是jdk-18.0.2/,把bin/,lib/,conf/直接解到/opt/jdk18下。-C指定进入目录后再解压,目标目录必须存在,所以先mkdir -p。这样JAVA_HOME=/opt/jdk18是固定路径,之后写环境变量、重启服务、打包到其它机器都不受版本号影响。

如果你不想用strip,也可以先解到/opt

sudo tar -xzf jdk-18_linux-x64_bin.tar.gz -C /opt

再给自动带上版本的目录做一个软链接:

sudo ln -sf /opt/jdk-18.0.2 /opt/jdk18

两种方式效果一样。差别在于strip不需要知道具体小版本号,在自动化脚本里更稳;软链接方式能保留原始目录结构,方便你看到实际版本。解压到/opt/jdk18后,建议顺手确认一下文件属主:如果你用 root 解压,普通用户可以读和执行;如果你用普通用户解压,后续 systemd 服务可能读不了,需要执行sudo chown -R root:root /opt/jdk18。确认无误后,压缩包本身可以删掉,安装过程已经结束,剩下的只是环境变量。

3.2 JAVA_HOME 和 PATH 写进 profile.d,还是 ~/.bashrc

环境变量配置有两种常见落点:全局配置写在/etc/profile.d/jdk18.sh,当前用户配置写在~/.bashrc。写全局的好处是所有用户都能用,适合专门跑构建任务的服务器;写用户级的好处是不影响系统其它用户,适合多环境共存。实际取舍看下表:

写入位置生效范围推荐场景
/etc/profile.d/jdk18.sh所有新登录 shell单 JDK 服务器、CI 构建机
~/.bashrc当前用户交互 shell个人开发机、多用户共用
~/.profile当前用户登录 shell桌面环境、非 bash 登录 shell

配置命令我一般这样写:

sudo tee /etc/profile.d/jdk18.sh >/dev/null <<'EOF' export JAVA_HOME=/opt/jdk18 export PATH="$JAVA_HOME/bin:$PATH" EOF source /etc/profile.d/jdk18.sh

tee以 root 权限写入文件,>/dev/null是丢掉 tee 在终端打印的内容。heredoc 的'EOF'加了引号,变量不会被提前展开,$JAVA_HOME会原样写进文件。source 让当前 shell 立刻生效,但严格来说,/etc/profile.d中的脚本只在这个用户通过登录 shell 进入时自动执行,已经打开的终端还是要手动 source 一次。更保险的做法是source /etc/profile.d/jdk18.sh后立刻执行echo $JAVA_HOME,看到/opt/jdk18才算配置完成。

PATH里的"$JAVA_HOME/bin:$PATH"顺序也值得解释。把 JDK 的 bin 放到前面,是为了覆盖系统可能自带的旧 Java;如果反过来写成$PATH:$JAVA_HOME/binwhich java大概率还是指向/usr/bin/java,Java 版本不会被切换。多数人遇到“明明装了 18,java -version 还是 11”就是这个顺序问题。

3.3 环境变量配置失败的三类现场

配置失败最常见的不是写错路径,而是没有重新加载。第一种是你在一个终端里改了~/.bashrc,然后直接开新窗口,有些桌面终端不读取,得source ~/.bashrc。第二种是用sudo -u user bash切换用户,sudo默认会重置环境,加载不到普通用户自己定义的 JAVA_HOME;要模拟登录环境,用sudo -i -u user。第三种是系统里已经装了openjdk-17-jdk这类包,/usr/bin/java存在,这时即使你新加的 PATH 在前面,which java还是/usr/bin/java,需要执行type -a java看完整搜索顺序。

还有一种容易被忽略的:在 systemd service 文件里写的Environment=JAVA_HOME=/opt/jdk18只对那个服务生效,和/etc/profile.d没有任何关系。容器镜像一般也加载不到 profile,所以 Dockerfile 里要自己写ENV JAVA_HOME=/opt/jdk18。区分清楚这些场景,环境变量配置的成功率会高很多。

4. 验证 JDK 18 安装结果:java -version 之外的 4 个排错点

很多 JDK 安装教程只验证java -version就收尾了,这在生产环境远远不够。JDK 是整套工具链,javac负责编译,jlink负责生成精简运行时,jar打包容错也不同。我在验证安装时会让四类命令逐个跑一遍,通过全部验证之后,才算 JDK 18 真的“解压即用”。

4.1 用一套命令完成 JDK 18 最小验证

echo "JAVA_HOME=$JAVA_HOME" type -a java java -version javac -version jlink --version file "$JAVA_HOME/bin/java"

前四行确认环境变量和命令搜索顺序,java -version看运行时,javac -version看编译器和对 JDK 版本的识别,jlink看模块工具链。最后一行file比较容易被忽略,它能直接告诉你这个java二进制是什么格式,比如输出ELF 64-bit LSB pie executable, x86-64,说明当前包和 x86_64 系统匹配。

如果java -version输出里包含openjdk version "18.0.2",紧接着是 Oracle JDK 或 OpenJDK 的标识,说明运行正常。真正要注意的是which java指向了别处,比如/usr/bin/java,这通常意味着 PATH 里还有旧版本在抢位置,需要回到上一章调整 PATH 顺序。对靠 crontab 跑 Java 任务的机器,还建议在脚本顶部显式source /etc/profile.d/jdk18.sh,否则 cron 环境不会加载 profile.d。

4.2 “cannot execute binary file:Exec format error” 的根因

这个报错语义很明确:内核认为这个文件不是能执行的格式。大多数情况是下载了错误的架构包。比如,你在 ARM 服务器上下载了jdk-18_linux-x64_bin.tar.gz,解压后运行就会这样报错。还有一类情况是机器内核是 64 位,但用户态是 32 位容器,glibc不满足 JDK 18 的最低要求,同样会拒绝执行。

排查顺序建议是:

uname -m file "$JAVA_HOME/bin/java" ldd "$JAVA_HOME/bin/java" | head -20

ldd能看到它依赖的动态库是否都在。如果输出里有not found字样,说明基础发行版缺少对应库;若报GLIBC_2.32 not found这种错,说明系统 glibc 版本低于 JDK 18 的需求。这类问题没法只靠解压解决,要么换低版本 JDK,要么升级基础系统。

4.3 javac 输出乱码和处理 locale

当系统区域设置不是 UTF-8 时,Java 虚拟机打印的中文提示会变成问号或方块。这和压缩包本身没关系,更不是解压文件乱码的问题。在中文环境中,先看一眼当前 locale:

locale | head -3

如果输出里没有任何UTF-8,可以用export LANG=zh_CN.UTF-8 LC_ALL=zh_CN.UTF-8临时修正。LC_ALL的优先级高于LANG,两个同时设为 UTF-8 能避免很多 Java 进程输出乱码。JDK 18 官方 tar.gz 包内部的文件名是 ASCII,解压过程不会产生文件名乱码;以前用unzip -O GBK处理 zip 包的方法在这里用不上。不过如果你把 JDK 目录通过 zip 传到远端再解压,就可能引入乱码,这也是我一直推荐直接传 tar.gz 的原因。

验证和排错常用对应关系放到一起:

现象根因修复
java: command not foundPATH 没写或没 source重看 3.2 节
cannot execute binary file架构不匹配或 32 位环境按 2.1 下载正确架构包
Error: could not open ...JAVA_HOME 目录路径错误echo $JAVA_HOME
javac 输出乱码locale 不是 UTF-8设置 LANG 和 LC_ALL

5. JDK 18 与旧版本共存:用 update-alternatives 一键切换

服务器上已经有一个 JDK 8 或 JDK 11,这时再装 JDK 18,不建议直接改全局 PATH。update-alternatives 是 Debian/Ubuntu 系 Linux 标准的版本切换工具,不需要写复杂的符号链接脚本,一条命令就能把/usr/bin/java指到想用的版本上。

5.1 把 JDK 18 注册为 java 和 javac 的备选项

sudo update-alternatives --install /usr/bin/java java /opt/jdk18/bin/java 1800 sudo update-alternatives --install /usr/bin/javac javac /opt/jdk18/bin/javac 1800 sudo update-alternatives --config java

最后一条命令会列出系统里所有已注册的 JDK,输入编号选择要默认用哪个。优先级数字 1800 是按版本号乘 100 得来的,如果还有 JDK 11 和 JDK 8 的备选项,优先级分别是 1100 和 800,默认会选 JDK 18。你还需要对javac执行同样的--config,因为javajavac是两个独立注册项,不同步容易出现java -version是 18、javac -version还是 17 的割裂状态。

更新完后用update-alternatives --list java能看到所有可切换的路径,想要指定某个路径设为默认,可以执行sudo update-alternatives --set java /opt/jdk18/bin/java。这个命令只改/usr/bin/java的软链接,不影响你手动export JAVA_HOME的当前 shell。

5.2 不碰系统,只在当前终端用 JDK 18

update-alternatives的缺点是操作是全局的,会直接影响所有用户。如果你只是想在当前终端里做一次编译测试,定义一个 shell 函数更合适:

use_jdk18() { export JAVA_HOME=/opt/jdk18 export PATH="$JAVA_HOME/bin:$PATH" }

把这个函数写进~/.bashrc,新终端里敲use_jdk18就会切到 JDK 18。因为它只是改变当前进程的环境变量,不会动/usr/bin,系统其它进程依然使用原来的 JDK。表格对比一下两种方式:

方式作用范围适合场景
update-alternatives全局 /usr/bin服务器默认 JDK
shell 函数 export当前终端临时编译测试
systemd 环境变量单个服务服务的运行时环境

5.3 配合符号链接处理小版本升级

如果你按第 3 章写死了/opt/jdk18,那升级 JDK 18 的小版本时,不需要改动任何环境变量和 alternatives 配置。把新压缩包用相同的--strip-components=1解压到/opt/jdk18-new,确认无误后执行:

sudo rm /opt/jdk18 sudo ln -s /opt/jdk18-new /opt/jdk18

这样JAVA_HOME依旧指向/opt/jdk18PATH不用变,服务的启动命令也不用改。在构建容器镜像时同理:Dockerfile 里ENV JAVA_HOME=/opt/jdk18即可,不需要再跑 source。完成软链接后,再执行一次java -version确认版本已经切换,并顺手用ls -l /opt/jdk18/bin/java看看主程序软链接是否指向了新目录。

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

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

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

立即咨询