想看 Linux 服务器装了哪个 JDK 版本,最直接的方式是执行 java -version 和 javac -version,再用 echo $JAVA_HOME、which java 交叉确认安装路径,四个命令各看一个维度,配合起来才能回答完整。
用 linux 查看 jdk 版本命令之前,先搞懂你看到的是什么
很多人在服务器上敲完 java -version,看到输出里有 “1.8.0_402” 或 “17.0.10”,就以为这是 JDK 版本,这个理解在多数场景下成立,但严格来说并不完全准确。
java -version 显示的是 JRE(Java Runtime Environment)的版本,JDK 自带 JRE,所以你平时用 java 跑程序没问题,但 JDK 还附带编译器 javac、打包工具 jar、文档生成器 javadoc,如果服务器上只装了 JRE,没装完整 JDK,java -version 一样有输出,但 javac -version 会提示找不到命令。
行业共识认为,判断一台服务器是否具备完整的 JDK 环境,至少要看两个输出:
java -version确认运行时版本javac -version确认编译工具存在
java -version 输出里的关键信息怎么读
执行 java -version 后,通常会有三行输出,以 OpenJDK 17 为例:
openjdk version "17.0.10" 2026-01-16
OpenJDK Runtime Environment (build 17.0.10+7)
OpenJDK 64-Bit Server VM (build 17.0.10+7, mixed mode, sharing)
三行各自说明一件事:
- 第一行:JDK 的版本号。
0.10里的17是主版本,10是安全更新级别 - 第二行:运行时环境的构建信息,括号里
0.10+7代表具体的 build 编号 - 第三行:虚拟机实现和运行模式。
64-Bit表示 64 位,Server VM表示服务端虚拟机,mixed mode表示解释执行和 JIT 编译混合运行
如果你跑的是 JDK 8,第一行会写成 8.0_402 这种格式,8 Java 8,这是 Java 8 时代特有的命名方式,看到 8 开头不代表装了 18 版,而是 8 版。
javac -version 验证编译器
javac -version 的输出比 java -version 简单得多:
javac 17.0.10
如果服务器只装了 JRE,这一步会直接提示:
-bash: javac: command not found
所以当别人问“linux 查看 jdk 版本用啥命令”,正确的回复是:先跑 java -version 和 javac -version,两个都跑一遍才算数。
linux 怎么查看 jdk 安装路径,有时需要多绕一步
版本号确认了,接着就要回答一个问题:JDK 到底装在哪个目录,这个信息很重要,配置 JAVA_HOME、部署 Tomcat、排查启动日志时都离不开它。
用 which 和 readlink 逐层拆解
最简单的命令是 which java,它会输出 java 可执行文件所在的路径,
/usr/bin/java
但 /usr/bin/java 通常不是你真正要找的路径,Linux 发行版的包管理器会把可执行文件放到 /usr/bin,实际 JDK 文件在 /usr/lib/jvm 或 /opt 下,/usr/bin/java 只是一个软链接。
这时候用 ls -l 看一下链接指向:
ls -l /usr/bin/java
输出可能是:
/usr/bin/java -> /etc/alternatives/java
这又是一个软链接,继续追:
ls -l /etc/alternatives/java
最终会指向真实的 JDK 主目录,
/etc/alternatives/java -> /usr/lib/jvm/java-17-openjdk-amd64/bin/java
为了省事,直接用 readlink -f 一步到位:
readlink -f $(which java)
它会自动解析所有中间层级的软链接,直接输出真实路径。
从环境变量找到 JAVA_HOME
如果服务器已经配置了 JAVA_HOME,查看的时候不用再去追软链接了:
echo $JAVA_HOME
输出像这样就是标准配置:
/usr/lib/jvm/java-17-openjdk-amd64
JAVA_HOME 指向的是 JDK 的根目录,而 which java 查到的是 bin/java 文件,日常运维写脚本时,引用 ${JAVA_HOME}/bin/java 比直接写死路径更稳妥,以后升级 JDK 版本只要改环境变量一处。
配置文件里查 JDK 路径
有些场景下命令行查不到结果,java -version 能跑,但 echo $JAVA_HOME 是空的,这说明 java 命令是通过 PATH 找到了可执行文件,但 JAVA_HOME 没有配置到位。
去这几个文件里搜一下 JAVA_HOME 或 jdk 关键字:
/etc/profile/etc/profile.d/目录下的脚本~/.bashrc~/.bash_profile
多数情况下,安装完 JDK 后配置会写在这些文件里,找到后就能确认路径。
用 linux 当前使用的 jdk 版本是什么,环境变量说了算
服务器上装多个 JDK 版本是常见的操作,一台机器可能装了 JDK 8 兼容老项目,又装了 JDK 17 跑新服务,问题是:命令行里敲 java,用的到底是哪一个?
这个问题的答案不在 JDK 安装位置上,而在 PATH 变量的搜索顺序里。
PATH 优先级高于 JAVA_HOME
Linux 执行 java 命令时,会按照 PATH 环境变量里记录的目录顺序,从头到尾逐个查找名为 java 的可执行文件,找到第一个就直接运行。
JAVA_HOME 只是个普通的变量,它不会主动影响系统选择哪个 java,系统不认识 JAVA_HOME,只知道 PATH,真正决定当前生效版本的是 PATH 中 java 所在的目录排在哪个位置。
看一下当前 PATH:
echo $PATH
假设输出为:
/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/lib/jvm/java-8-openjdk/bin
而 /usr/bin/java 指向 JDK 17,/usr/lib/jvm/java-8-openjdk/bin/java 是 JDK 8,因为 /usr/bin 排在 java-8 目录前面,所以直接敲 java -version 看到的是 17。
想确认当前究竟哪个目录的 java 先被命中,用 which java 看返回值,它返回的就是系统实际选中的那个文件路径。
临时切换 JDK 版本的命令
如果只是想在当前会话里用另一个 JDK,不需要修改系统配置,直接改 PATH:
export PATH=/usr/lib/jvm/java-8-openjdk/bin:$PATH
再执行 java -version,输出的就会变成 JDK 8,这个改动只对当前终端生效,退出重进终端就恢复原样。
update-alternatives 管理默认 JDK
如果希望永久切换系统的默认 JDK,多数 Linux 发行版提供了 update-alternatives 工具:
update-alternatives --config java
执行后会出现一个列表,列出系统里已注册的所有 JDK:
There are 3 programs which provide 'java'.
Selection Command
-----------------------------------------------
1 /usr/lib/jvm/java-17-openjdk-amd64/bin/java
+ 2 /usr/lib/jvm/java-8-openjdk/bin/java
3 /opt/jdk-21/bin/java
Enter to keep the current selection[+], or type selection number:
输入对应的数字回车,就完成了默认 JDK 的切换,同样地,javac 也需要单独切换一次,因为 javac 是独立的可执行文件:
update-alternatives --config javac
切换完后,重新执行 java -version 和 javac -version,确认两边版本一致。
怎么判断装的是 OpenJDK 还是 Oracle JDK
很多开发者拿到服务器权限后,看版本号不顺眼,就认定是某个厂商的 JDK,结果部署时发现行为不对,其实从输出信息就能直接辨别。
看 java -version 的第一行关键字
- 输出
openjdk version的是 OpenJDK - 输出
java version或Java(TM) SE Runtime Environment的是 Oracle JDK
Oracle JDK 8 的输出:偏低
java version "1.8.0_201"
Java(TM) SE Runtime Environment (build 1.8.0_201-b09)
Java HotSpot(TM) 64-Bit Server VM (build 25.201-b09, mixed mode)
OpenJDK 8 的输出:
openjdk version "1.8.0_402"
OpenJDK Runtime Environment (build 1.8.0_402-02)
OpenJDK 64-Bit Server VM (build 25.402-b02, mixed mode)
看到 Java(TM) 和 HotSpot(TM) Oracle 的商业版,看到 OpenJDK 字样就是开源版。
按发行版差异看安装来源
不同 Linux 发行版自带的 JDK 也有差异:
- CentOS / RHEL 上通过
yum install java-17-openjdk装的是 OpenJDK - Ubuntu / Debian 上通过
apt install openjdk-17-jdk装的是 OpenJDK - 从 Oracle 官网下载
.tar.gz解压包安装的是 Oracle JDK - 部分云厂商镜像里直接装了 OpenJDK
统计显示,云服务器厂商的公共镜像里预装的 JDK 绝大多数是 OpenJDK,因为它的开源许可允许直接随系统分发,如果你的服务器是云主机,登录后看到 OpenJDK 是正常现象,不影响生产使用。
运行 Alibaba Dragonwell 等衍生 JDK 的识别
简米云镜像里也预装了基于 OpenJDK 的 Alibaba Dragonwell,执行 java -version 输出会带 Alibaba Dragonwell 字样,这类 JDK 是 OpenJDK 的下游构建版,来自阿里内部对大规模 Java 应用经验的回馈,对国内场景做了特定优化,同样可以正常用于生产。
安装了新 JDK 但版本没变,常见原因排查
安装新版 JDK 后,执行 java -version 发现版本还是旧的,这种情况极其常见,不用急着重装,按下面几步排查。
检查 PATH 的排序
先看 which java 指向的文件路径,如果还是在旧的 JDK 目录,说明 PATH 里旧路径排在新路径前面,Linux 的 PATH 是按顺序搜索的,谁排在前面谁说了算。
解决办法:把新 JDK 的 bin 目录添加到 PATH 开头,或者删掉旧 JDK 在 /usr/bin 里的软链接。
检查用户级别配置覆盖系统配置
系统级配置写在 /etc/profile 里,但当前用户自己的 ~/.bashrc 或 ~/.bash_profile 如果有额外的 PATH 设置,~/.bashrc 通常后执行,会覆盖系统级配置。
执行以下命令确认加载顺序:
env | grep PATH
对比输出和 /etc/profile 里的设置是否一致,如果不一致,说明用户级配置生效了,需要改 ~/.bashrc。
检查环境中残留的旧 JDK 包
CentOS 系统上使用 yum 卸载 JDK,经常出现卸载不干净的情况,用包管理器查一下已安装的 JDK 包:
rpm -qa | grep jdk
如果有残留包,用 yum remove 移除,Ubuntu 系统查看:
dpkg -l | grep jdk
检查 shell 缓存
bash 会缓存命令的路径,重新安装或修改软链接后,当前终端的缓存没有刷新,执行 hash -r 清空缓存,或者直接关闭终端重开一个。
常见问题:linux 查看 jdk 版本相关疑问
为什么 java -version 和 javac -version 显示不同版本?
同一台服务器上安装了多个 JDK,PATH 目录里 java 和 javac 的来源不同。java 命中了 /usr/bin/java(指向 JDK 17),而 javac 命中了 /usr/lib/jvm/java-8-openjdk/bin/javac(JDK 8),排查方法是在两个命令前都加上 which,对比两个命令各自的实际路径,修正方向是统一 JAVA_HOME,确保 PATH 里的 java 和 javac 都来自同一 JDK 目录。
查看 JDK 位数只能用 java -version 吗?
java -version 第三行有 64-Bit 字样表示是 64 位 JDK,32 位的 JDK 不会在输出里写到 32-Bit,只写 Java HotSpot(TM) Server VM,也可以用 file 命令查看 java 可执行文件的架构信息:
file /usr/bin/java
输出的 ELF 64-bit 表示 64 位,日常使用中不建议在 64 位系统上混装 32 位 JDK,排查问题时先用 java -version 确认即可。
新装的 JDK 路径没有被系统识别怎么办?
确认安装目录完整后,把以下配置写入 /etc/profile 末尾:
export JAVA_HOME=/opt/jdk-17
export PATH=$JAVA_HOME/bin:$PATH
执行 source /etc/profile 让配置立即生效,再跑 java -version 验证,务必注意 PATH 赋值时把 $JAVA_HOME/bin 放在最前面,否则系统优先搜索 /usr/bin 后可能调用旧版本。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/linux%e5%a6%82%e4%bd%95%e6%9f%a5%e7%9c%8bjdk%e7%89%88%e6%9c%ac%ef%bc%9f%ef%bc%8c%e6%9f%a5jdk%e7%89%88%e6%9c%ac%e5%91%bd%e4%bb%a4%e6%98%af%e4%bb%80%e4%b9%88/


