简介:这是一份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_64 | Intel / AMD x64 | jdk-18_linux-x64_bin.tar.gz |
| aarch64 | ARMv8 及以上 | 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.shtee以 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/bin,which 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 -20ldd能看到它依赖的动态库是否都在。如果输出里有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 found | PATH 没写或没 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,因为java和javac是两个独立注册项,不同步容易出现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/jdk18,PATH不用变,服务的启动命令也不用改。在构建容器镜像时同理:Dockerfile 里ENV JAVA_HOME=/opt/jdk18即可,不需要再跑 source。完成软链接后,再执行一次java -version确认版本已经切换,并顺手用ls -l /opt/jdk18/bin/java看看主程序软链接是否指向了新目录。
本文还有配套的精品资源,点击获取