资讯详情

资讯详情

Linux下JDK安装配置全指南:从下载到环境变量与多版本切换

做 Java 开发这些年我几乎每次换服务器、搭新环境都要在 Linux 上重新折腾一遍 JDK 的下载和安装。这活儿说简单是真简单说恶心也是真恶心Oracle 官网的下单入口藏得深、下载慢版本选错了装完启动就报错环境变量配好了新开一个窗口又失效……我身边不少同事都在这些地方反复栽跟头。这篇文章我就把 Linux 下 JDK 下载、安装、环境变量配置、多版本切换、常见报错排查这一整条链路按我的实际操作经验完整梳理一遍。你不需要再去翻十几篇碎片化教程拼答案照着这篇走基本能一次过。适合刚入门的 Java 开发、要批量给服务器出环境的运维以及被各种“JDK no found”折磨的测试同学。1. 装 JDK 之前先想清楚版本选型与平台判断很多人的第一反应是直接去官网下载最新版本这恰恰是后面出问题的根源。JDK 不像普通软件那样“越新越好”它在 Linux 上涉及发行版授权、LTS 生命周期、CPU 架构匹配三个问题任何一个搞错后面全白搭。1.1 OpenJDK 与 Oracle JDK 怎么选先说结论绝大多数场景下直接用 OpenJDK 发行版就够了别一上来就盯着 Oracle JDK。Oracle JDK 从 JDK 8 的某个 update 开始就对商用场景收费了。它提供长期支持和商业授权适合有合规要求、需要 Oracle 官方技术支持的企业。而 OpenJDK 是完全开源免费的两者在 API 层面基本兼容源码同源绝大多数普通项目跑在 OpenJDK 上完全没有问题。实际开发中常见的 OpenJDK 发行版有几个Eclipse TemurinAdoptium 项目维护社区最活跃推荐Amazon CorrettoAWS 维护云环境里用得很多Microsoft Build of OpenJDK微软维护Liberica JDKBellSoft 维护兼容性测试比较全我自己的习惯是生产服务器优先用 Temurin 或者 Corretto安全补丁跟得勤文档也多。除非项目有硬性合规要求否则不建议为了“Oracle 官方”四个字去付费。1.2 版本号别乱跟风LTS 才是生产环境的底线Java 的版本节奏是每半年出一个新版本但只有 LTS长期支持版本才是生产环境该待的地方。目前大家用得最多的 LTS 就这几个JDK 8老项目的绝对主力很多遗留系统还在上面跑JDK 11Spring Boot 2.x 时代的常见选择JDK 17Spring Boot 3.x 的硬性要求当前最主流JDK 21新一代 LTS新项目可以考虑怎么判断自己该装哪个版本三步走看项目配置文件Maven 项目看pom.xml里的java.versionGradle 项目看build.gradle里的sourceCompatibility看运行环境要求比如 Spring Boot 3 强制 JDK 17 及以上实在没要求就选 JDK 17兼容性和性能都足够稳妥还有一类比较特殊的场景比如 JMeter 5.x官方文档写的是支持 JDK 8/11/17很多人为了省事装了最新版 JDK 21反而出现奇怪的插件兼容问题。这类工具型软件建议严格按它的要求走。网上经常有人问“jdk降级到17怎么弄”多半就是一开始装了太高版本后面又被迫切回来。所以开头选稳一点后面就少折腾。1.3 先确认 CPU 架构再谈下载这一步最容易被忽略但错一步整个包就白下了。Linux 服务器的 CPU 架构常见两种x86_64 / amd64绝大多数云服务器和物理机aarch64 / arm64ARM 架构服务器、部分国产芯片设备判断命令很简单uname -m输出x86_64就下 x64 的包输出aarch64就下 aarch64 的包。Oracle 官网下载页会把 Linux x64、Linux aarch64 分成两个下载项Adoptium 网站也有类似区分。选错了安装包装的时候不一定报错但运行 Java 程序时很可能直接抛“bad ELF interpreter”或者“cannot execute binary file”那时候再排查只会浪费时间。2. JDK 下载渠道全对比官网直下、镜像源、包管理器JDK 的下载渠道五花八门我整理下来主要就三类Oracle 官网直接下载、开源项目官网或镜像站下载、系统包管理器安装。各有各的适用场景下面挨个说清楚。2.1 Oracle 官网下载流程与注意事项Oracle 官网是所有 JDK 版本最全的源头地址是https://www.oracle.com/java/technologies/downloads/。页面默认展示 JDK 21 等较新版本想下老的 8u 系列需要往下翻找存档入口。在 Linux 服务器上操作基本流程是这样的找到对应版本的下载区域选择 Linux 标签页根据uname -m的结果选 x64 或 aarch64 的 tar.gz 包点击下载浏览器会自动弹出许可协议确认需要勾选接受拿到下载链接后用 wget 直接在服务器上下载wget https://download.oracle.com/java/17/latest/jdk-17_linux-x64_bin.tar.gz有一点要注意Oracle 网站对部分旧版本的 tar.gz 下载做了登录墙尤其是 JDK 8u 的老版本和部分中间版本必须注册 Oracle 账号并登录后才能下载。如果服务器上没有图形界面建议在本地浏览器登录后获取直链再传到服务器上或者直接用下面的开源发行版没有这么多限制。2.2 Adoptium / Eclipse Temurin开源社区主力我觉得对于绝大多数开发者Adoptium 才是更好的下载入口地址是https://adoptium.net/。它把 JDK 版本、操作系统、架构、包格式都做成下拉选项选完直接给直链不需要登录。它的下载链接还可以直接用命令拼接方便在服务器上拉包。比如下载 Temurin 17 的 Linux x64 tar.gzwget https://github.com/adoptium/temurin17-binaries/releases/download/jdk-17.0.10%2B7/OpenJDK17U-jdk_x64_linux_hotspot_17.0.10_7.tar.gz这里的%2B是 URL 编码里的加号因为 Adoptium 的版本号格式是17.0.107加号放到 URL 里必须编码直接复制带加号的链接往往下载失败。这个细节坑过不少人。2.3 用 apt/yum 包管理器安装最省事但有版本限制如果对版本没有特殊要求用系统自带的包管理器安装是最省事的方案环境变量和软链接系统都帮你处理好了。Debian/Ubuntu 系sudo apt update sudo apt install openjdk-17-jdkRHEL/CentOS 系sudo yum install java-17-openjdk-devel装完默认安装在/usr/lib/jvm/目录下java -version直接就能用。但缺点也很明显软件源里有什么版本你才能装什么版本。CentOS 7 的默认源只有 JDK 8想装 17 还得换源或者手动解压Ubuntu 22.04 默认源里有 JDK 17 和 21还算够用。如果项目对版本有新要求大概率还是得走 tar.gz 手动安装这条路。2.4 下载完必须做的事校验 SHA-256这一步我强烈建议所有人都不要跳过尤其是从非官网渠道或镜像站下载的包。下载过程中网络中断、CDN 节点异常都可能导致文件损坏解压到一半报错还算好的怕的是文件被篡改后你浑然不觉把带问题的 JDK 装进生产环境。官网每个下载项旁边都会给出一串 SHA-256 校验值下载完比对一下sha256sum jdk-17_linux-x64_bin.tar.gz拿输出的哈希值和官网公布的对照一致再解压。不一致就重新下载别心存侥幸用损坏的包继续装。实测下载大文件时出错的概率真不低这个习惯能帮你省去后面一整晚的排查时间。3. Linux 下 JDK 安装全流程从解压到环境变量生效下载环节解决之后安装就进入正题了。我把最常用的 tar.gz 手动安装和 rpm/deb 包安装两条路都讲一遍你按自己的发行版和习惯选一条走。3.1 tar.gz 手动安装目录规划和解压细节tar.gz 手动安装的好处是版本完全可控装几个版本共存都没问题。关键是要先规划好安装目录别随手解压到/tmp或者家目录最后自己都找不到。我习惯统一放到/usr/local/java/下结构清晰一看就知道机器上有哪些 JDK 版本cd /tmp wget https://github.com/adoptium/temurin17-binaries/releases/download/jdk-17.0.10%2B7/OpenJDK17U-jdk_x64_linux_hotspot_17.0.10_7.tar.gz sudo mkdir -p /usr/local/java sudo tar -xzf OpenJDK17U-jdk_x64_linux_hotspot_17.0.10_7.tar.gz -C /usr/local/java/解压完成后目录结构是/usr/local/java/jdk-17.0.107/。这里有个推荐做法解压后建一个不带版本号的软链接比如/usr/local/java/current指向当前要用的版本这样以后升级版本只需要改软链接指向环境变量路径不用动。我自己的服务器就一直是这个格局sudo ln -s /usr/local/java/jdk-17.0.107 /usr/local/java/current另外建议确认一下解压出来的目录归属如果是 root 权限下载解压的其他用户可能会在读写上有问题sudo chown -R root:root /usr/local/java/jdk-17.0.1073.2 环境变量配置/etc/profile、/etc/profile.d 与 ~/.bashrc 的区别解压完不等于装完Linux 不认识 JDK 在哪必须配置环境变量。这一步是翻车重灾区。先理解三个配置文件的分工/etc/profile系统级登录脚本所有用户登录时都会执行/etc/profile.d/下的脚本登录时会被/etc/profile自动引用按文件名排序执行~/.bashrc当前用户的 Bash 非登录交互式 Shell 配置最佳实践是不要直接改/etc/profile而是新建一个独立的/etc/profile.d/jdk.sh这样职责单一出了问题也容易回退sudo vim /etc/profile.d/jdk.sh写入以下内容export JAVA_HOME/usr/local/java/current export PATH$JAVA_HOME/bin:$PATH然后执行source /etc/profile.d/jdk.sh为什么用$JAVA_HOME/bin而不是直接写死路径因为以后切版本只要改软链接这一行不用动。为什么 PATH 要把$JAVA_HOME/bin放在最前面因为如果机器上存在其他版本的 Java比如系统自带的 openjdk 在/usr/bin/java放在前面才能确保优先使用你自己指定的版本放在后面会被系统版本抢先Java 命令执行的还是旧的。关于 CLASSPATH现在的新版 JDK 根本不需要手动配置编译器会自动处理类路径。网上很多老教程还在教export CLASSPATH.:$JAVA_HOME/lib那是 JDK 8 之前的老黄历了加上反而可能引发诡异问题我不建议配。3.3 验证安装与常见配置误区配置完环境变量验证环节别只敲一条命令就完事。我一般按顺序检查这几条echo $JAVA_HOME java -version javac -version which java正常输出应该类似/usr/local/java/current openjdk version 17.0.10 ... javac 17.0.10 /usr/local/java/current/bin/javajava -version能跑、javac -version报错的情况很常见一般是 PATH 只加了$JAVA_HOME/bin但 JAVA_HOME 写错了导致 Java 命令靠系统路径找到旧版本。所以 JAVA_HOME 和 PATH 两行要一起配。还有个细节which java返回的路径不在你指定的目录里说明 PATH 顺序有问题回去检查第 3.2 节说的那个顺序原则。另外java第一次执行时会在用户家目录下生成一个hsperfdata_xxx之类的性能数据目录这是正常现象不是垃圾文件别手抖删掉。3.4 rpm/deb 包安装与 update-alternatives 多版本切换如果下载的是 rpm 包安装命令直接sudo rpm -ivh jdk-17_linux-x64_bin.rpmrpm 包会安装到/usr/java/jdk-17.x.x/并且自动注册到系统的alternatives机制里java -version默认就能用。deb 包同理sudo dpkg -i jdk-17_linux-x64_bin.deb多版本共存的管理推荐用update-alternatives这是 Linux 系统的标准方案。手动安装的 tar.gz 包也可以注册进去sudo update-alternatives --install /usr/bin/java java /usr/local/java/jdk-17.0.10/bin/java 100 sudo update-alternatives --install /usr/bin/javac javac /usr/local/java/jdk-17.0.10/bin/javac 100切换版本sudo update-alternatives --config java这是我在有多套 JDK 的机器上最常用的命令比手动改软链接安全得多。如果你遇到某个图形工具比如 DBeaver 启动用的还是旧 JDK那多半是它自己的启动脚本里写死了-vm参数去它的dbeaver.ini里改指向新版本就行和系统环境变量是两回事。4. 环境变量配置失败与“找不到 JDK”的排查实录“jdk环境变量配置失败”“找不到jdk”这类问题是 Linux 下 Java 环境最经典的拦路虎。我把真正高频的几个故障场景和一个完整的排查套路放这里你遇到问题对着查就行。4.1 为什么 source 之后还是 java: command not found这类问题的典型状态是明明配置了环境变量也执行了source但开新窗口或者重启后java命令还是找不到。顺着这个顺序排查echo $JAVA_HOME echo $PATH如果JAVA_HOME为空说明配置文件没生效。常见原因如下配置文件放到了~/.bashrc但你是通过 SSH 登录的非交互式方式执行命令根本没加载它配置文件里有空格比如export JAVA_HOME /usr/local/java这行代码在 shell 里是“执行一个叫 JAVA_HOME 的命令”当然不会成功执行source的时候不是同一个终端会话或者source后没重新打开窗口而 GUI 环境里的新终端默认不加载/etc/profile系统默认 shell 不是 bash用户的~/.zshrc里没有同样配置我自己的排查经验是先打印 JAVA_HOME 和 PATH为空大概率是文件放错位置或引号问题直接看配置文件内容就能定位。不为空但 java 找不到基本就是 PATH 里没有$JAVA_HOME/bin或者该路径不存在软链接断链。还有一个生产环境经常踩的坑服务是用 systemd 管理的你手动在 shell 里配好了环境变量但服务进程的Environment里没配重启服务后它用的还是系统默认路径表现也是“找不到jdk”。这种情况需要把EnvironmentJAVA_HOME...和EnvironmentPATH...写进 service 文件里。4.2 /etc/profile 配置坏了导致登录异常怎么办如果直接改/etc/profile时手滑写错了语法比如少个引号、括号不匹配会导致整个系统登录流程卡住新 SSH 会话都无法正常建立。这个问题我处理过不止一次每次都有同事紧张得不行。正确的应急办法是Linux 默认登录时如果 profile 执行失败会退回到一个基础环境你仍然能通过新开一个 SSH 窗口执行命令只是 PATH 是个很精简的版本。此时用绝对路径调用编辑器进去把错误改回来/usr/bin/vim /etc/profile如果连编辑器都进不去可以这样启动一个干净的 shell/bin/sh -c /usr/bin/vim /etc/profile改完语法建议先做一个语法检查再继续用bash -n /etc/profile没有输出就是语法没问题。这也是我坚持让大家用/etc/profile.d/jdk.sh独立文件的原因出了问题删掉这个文件就能恢复不需要跟整个/etc/profile挤在一起。4.3 PATH 顺序、软链接冲突与多 JDK 并存问题机器上多套 JDK 并存时最常见的怪现象是java -version显示 17但javac -version显示 1.8两边版本对不上。原因很简单java和javac两个命令各自找到了不同 JDK 的路径。java走的是你 PATH 里指定的$JAVA_HOME/bin而javac可能被/usr/bin/javac的软链接先劫持了或者反过来。排查可以用type -a java type -a javac ls -l /usr/bin/java /usr/bin/javac update-alternatives --display javals -l看/usr/bin/java是个什么样的软链接指向哪里的 alternatives再逐层往里跟直到找到真实路径。大多数这类问题都能通过update-alternatives --config把 java 和 javac 统一指到同一套 JDK 解决。还有种情况是/usr/bin/java这个软链接直接失效显示红色断链状态。这时候用 update-alternatives 重新安装对应条目就行sudo update-alternatives --install /usr/bin/java java /usr/local/java/current/bin/java 1004.4 卸载旧 JDKrpm -e、apt remove 的正确姿势卸载这个东西很多人上来就是rm -rf一顿乱删结果系统里残留了一堆软链接连锁反应把其他工具搞崩。按安装方式分三类处理tar.gz 手动安装的删目录加清配置sudo rm -rf /usr/local/java/jdk-17.0.10 sudo rm -f /etc/profile.d/jdk.shrpm 安装的先查包名再卸载rpm -qa | grep -i jdk sudo rpm -e 包名deb 安装的Ubuntu 系dpkg -l | grep -i openjdk sudo apt remove --purge openjdk-17-jdk注意apt remove --purge会连配置文件一起删如果之后还要重装同版本建议保留配置用apt remove openjdk-17-jdk即可。装新版本前把update-alternatives里旧的注册条目也清一下避免残留下面的软链接sudo update-alternatives --remove java /usr/local/java/jdk-8/bin/java5. 高频问题速查面试题、常用命令与避坑清单最后这部分我把 Linux 下 JDK 相关的面试考点、常用命令和一张速查表整理出来。这些内容既是面试官爱问的也是平时运维排查真正会用的放到一起讲。5.1 面试常问的 JDK/JRE/JVM 区别与 Linux 环境考察点三者的关系是所有 Java 面试的第一题JDK 是 Java Development Kit包含 JRE 和开发工具javac、jdb、jpackage 等JRE 是 Java Runtime Environment包含 JVM 和核心类库只能运行不能开发JVM 是 Java Virtual Machine负责把字节码解释或编译成机器码执行。在 Linux 场景下面试官更爱问的是实操层面的问题比如如何在 Linux 上查看当前 Java 进程的堆使用情况答jstat -gc pid或者jmap -heap pid怎么定位 Java 进程占用 CPU 过高的问题答top找到 PIDjstack pid导出线程栈再配合top -H -p pid看线程级占用如何设置 JVM 启动参数跑一个 jar答java -Xms512m -Xmx1024m -jar app.jar这些命令都属于 JDK 自带的工具都在$JAVA_HOME/bin目录下。所以你配置好 PATH 之后jps、jstack、jmap、jstat这些命令也应该能直接用如果某个工具命令找不到先检查 PATH 配置是不是被搞乱了。5.2 JDK 相关 Linux 常用命令清单我在给服务器配 Java 环境时用得最多的命令整理成一个清单命令作用uname -m查看 CPU 架构决定下载哪个安装包wget url从网站拉取安装包tar -xzf 文件解压 tar.gz 包sha256sum 文件计算校验值和官网比对java -version查看当前 Java 版本echo $JAVA_HOME打印环境变量值which java/type -a java定位 java 命令真实路径source 文件让配置立即生效update-alternatives --config java切换系统默认 Java 版本jps列出本机 Java 进程及 PID对运维来说经常还会配合ps -ef | grep java看进程启动参数配合nohup java -jar app.jar app.log 21 做后台启动。这些命令组合起来处理生产环境 Java 服务的基本问题就够了。5.3 高频故障速查表延续前面几个章节的排查思路我按问题现象、常见原因、解决办法三个维度做了一张速查表可以直接对照着用现象常见原因解决办法java: command not found环境变量未配置或未生效检查/etc/profile.d/jdk.sh执行source后重开终端JAVA_HOME 为空配置文件写错或放错位置检查文件路径确认没有多余空格java -version和javac -version不一致软链接/alternatives 指向混乱update-alternatives --config统一指向下载的安装包解压报错文件损坏删除重下重新校验 SHA-256老项目启动报 UnsupportedClassVersionErrorJDK 版本过新降级到项目要求的 LTS 版本服务重启后仍找不到 Javasystemd 环境未配置在 service 文件里加 Environment 变量登录后 PATH 异常/etc/profile语法错误用/bin/sh -c调编辑器修复bash -n检查语法这一套流程走下来我不敢说你从此再也不碰 JDK 安装问题但至少再遇到类似报错你能按图索骥而不是靠猜。最后再分享一个我个人的习惯把 JDK 的安装过程写成一条 Shell 脚本以后新机器一跑脚本就完事。核心就是把下载、解压、建软链接、写/etc/profile.d/jdk.sh、source这几步串起来版本号用变量传参。这样不管是帮同事救急还是给新服务器出环境都只是敲一行命令的事。我有好几台服务器就是靠这个脚本批量搞定的省下的时间足够再喝一杯咖啡。
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →