☰
Linux下JDK 1.8安装全攻略:从下载到环境变量配置
2026/10/22 10:47:01 网站建设 项目流程

我在实际工作中,帮人排查Linux环境问题的次数一多,发现一个特别共性的场景:刚接触Java开发的同学,往往先是Windows上写完代码跑通程序,然后一到服务器部署,第一件事就是装JDK。而这件事吧,网上教程一搜一大把,但很多都是复制粘贴,要么版本对不上,要么路径写死,要么装完java -version 能出结果,编译却报找不到javac。今天这篇文章,我就以VMware虚拟机里的Linux为例,把JDK 1.8的安装流程从头到尾捋一遍,包括下载选包、三种安装方式、环境变量配置以及我踩过的坑。

这内容特别适合两类人看:一类是想在虚拟机里搭一套完整的Java学习环境、但不想折腾太久的新手;另一类是已经在服务器上部署过应用、却对JDK安装细节还不太放心的同学。JDK 1.8这个版本虽然已经有年头了,但它占据的比例依然很高,尤其是不少老项目、旧系统都还跑在1.8上,所以搞清楚它的正确安装方式,不管是应付日常工作还是排查问题,都非常实用。

1. 开工之前搞清三件事:选发行版、选JDK包类型、确认系统位数

很多人装JDK翻车,第一步其实不是下载出了问题,而是自己在“选型”阶段就懵了。你打开Linux终端,手上有一台CentOS,脑子里想的却是Ubuntu的命令;你下载JDK的时候,分不清rpm包和tar.gz包到底有什么区别;你甚至不知道这台机器是32位还是64位,直接就下了一个x86的包。这三件事不搞清楚,后面的安装大概率会磕磕绊绊。

1.1 为什么到2025年还在装JDK 1.8

先把理念层面的事情说清楚。JDK 1.8,也就是Java 8,在很多技术社区里被戏称为“老古董”,但你去看看那些跑了好多年的生产系统,里面有大量的Spring Boot 2.x应用、旧版Hadoop生态、曾经的Android构建链,很多都绑定在Java 8上。并不是大家不想升级,而是升级JDK往往意味着要连带升级框架、中间件、调优参数,这个工程量在一套稳定的老系统里很难推动,所以很多公司和开发者选择了一直用1.8。

对我们个人来说,学习虚拟机环境时用JDK 1.8也是个相当稳的选择:文档极其丰富,遇到问题一搜就能搜到答案,而且它对系统资源的要求也不高,在VMware里分配1到2GB内存的Linux虚拟机上跑起来毫无压力。你用17、21虽然新,但有些旧教程里的参数已经变了,容易产生额外的困惑。

1.2 rpm、tar.gz、openjdk 到底怎么选

这是第一个容易卡住新手的地方。JDK在Linux下的常见形式有三种:rpm包、tar.gz压缩包、还有通过包管理器直接装的OpenJDK。

rpm包是RedHat系Linux(比如CentOS、RHEL、Fedora)专用的安装包格式,用rpm命令或者yum就能装,装完以后系统会把它纳入统一的软件管理列表,用rpm -qa | grep jdk能查到,卸载也比较规范。但它的问题在于安装位置很多时候是固定的,你不太容易自由指定目录。tar.gz包是通用的绿色压缩包,解压即用,不依赖特定的发行版,想放哪里就放哪里,升级或卸载也简单,直接删目录就行。openjdk是在线用yum或apt-get装的,最省事,但你拿到的不是那个经典的“JAVA SE”版本,某些商业项目或特定场景下,开发者会更喜欢用官方发布的JDK 1.8。

结合起来看,我最建议的方式是下载tar.gz包手动配置,这也是下面会重点展开的方式。它兼容性最好,路径可控,适合虚拟机环境,也适合以后理解服务器上的JDK部署逻辑。

1.3 先花一分钟确认系统信息

无论如何,在开始之前请先打开终端,执行下面这三条命令。

cat /etc/redhat-release # 查看CentOS/RHEL版本 uname -m # 查看系统架构,x86_64表示64位 free -h # 查看内存,确认至少1G以上

第一条命令在Ubuntu上可能不存在,没关系,那说明你用的大概率是Ubuntu/Debian,后面部分命令换成apt-get即可。重点是第二条命令,uname -m会输出机器架构,几乎所有的现代虚拟机都应该是x86_64,这就告诉你要下载x64版本的JDK包;如果你的输出是i686或者i386,那才是32位系统,这种老环境现在已经不太常见了。

注意:千万不要只看系统名字叫“Linux 64位”就下包,最好以uname -m的输出为准。我在虚拟机里见过太多因为系统重装后位数不同、JDK装错架构版本导致编译卡死的情况。

2. 下载JDK安装包,避开那些容易踩的坑

系统信息确认完毕,接下来是下载JDK。这一步看似最简单,实际上有非常多细节,尤其是对新手而言,一个不小心就会下载到JRE、下载到别人打包的非官方版本,或者下载了一个需要很久才能解压出来的残缺包。

2.1 下载前先搞懂版本号:JDK 8u281 和 1.8.0_281 是同一个东西

先说版本号的表述问题。JDK 1.8的官方版本号通常是形如“1.8.0_281”这样的格式,其中1.8.0表示Java 8的平台版本,_281是本次更新的编号。而在下载页面里,你又经常会看到“JDK 8u281”这种写法,这个8u281和1.8.0_281说的是同一个版本,没必要被绕晕。知道这一点,你在后续配置JAVA_HOME时,看到文件夹名是jdk1.8.0_281就不会觉得奇怪了。

2.2 选择正确的安装包:区分JDK和JRE

这是一个翻车率极高的点。官方下载页面里通常有两种包,一种是JDK,一种是JRE。对初学者来说,你很可能顺手就下载了文件名里带jre的包,因为看起来更小、下载更快。但如果你只装了JRE,那么系统中会有java命令,但没有javac命令,也就是说你只能运行别人已经编译好的class文件,而无法自己编译Java源码。这样一来,你想编译运行自己写的HelloWorld都会失败。

所以,请认准文件名里带有jdk字样的包,别贪图那一点体积。比如说,一个典型的文件名长这样:

jdk-8u281-linux-x64.tar.gz

这就代表它是JDK 8,更新到281,面向Linux 64位系统,以tar.gz形式提供。如果你下载的是jdk-8u281-windows-x64.exe,那给Windows用,别搞混。

2.3 下载到 Linux 的两种常用姿势

下载分两种场景,我分别说下操作方式。

第一种,也是新手最常用的场景:你在自己的Windows宿主机上通过浏览器下载好了JDK安装包,然后想把文件弄到VMware虚拟机里的Linux中。最简单的办法是使用VMware的“共享文件夹”功能。在VMware菜单里给虚拟机关闭的情况下,编辑虚拟机设置,在“选项”里添加一个宿主机文件夹作为共享文件夹,然后在Linux虚拟机里访问/mnt/hgfs/目录,就能看到那个文件夹,把JDK包复制到当前目录即可。

第二种场景是Linux系统可以直接联网,那你直接在终端里用wget或curl下载。不过很多官方下载页面需要勾选“接受许可协议”才能给出直链,直接wget可能会拿到一个跳转页面而不是真正的压缩包。实际操作中有个办法:先通过浏览器下载一次,浏览器会保留真实的下载地址,复制下来后放进wget命令里。但在教程里我不想把这个过程搞得太复杂,对于初学者,用第一种共享文件夹方式就行,稳妥且直观。

mkdir -p ~/tools cd ~/tools # 假设你已经通过共享文件夹把包放在 /mnt/hgfs/VMShare/ 下 cp /mnt/hgfs/VMShare/jdk-8u281-linux-x64.tar.gz . ls -l jdk-8u281-linux-x64.tar.gz

3. 三种安装方式实测:rpm、tar.gz、yum装OpenJDK

安装包准备好了,接下来是真正的安装环节。这里我结合自己的实际操作,把三种主流安装方式都写出来,你根据自己的偏好选择,但我个人最推荐第二种tar.gz方式,后面会说明理由。

3.1 rpm安装:两条命令搞定,但路径不可控

如果你下载的是.rpm文件,在CentOS上安装只需要两个命令:

rpm -ivh jdk-8u281-linux-x64.rpm

或者你用yum本地安装:

yum localinstall -y jdk-8u281-linux-x64.rpm

安装过程非常自动化,它会自动把JDK释放到系统的标准目录中,比如我这边常用的路径是/usr/java/jdk1.8.0_281。装完之后系统会自动配置好大部分命令软链接,你在终端里直接敲java -version通常就能看到结果。这是它的优势:省事。

但问题也在这里。你无法自由选择JDK的安装位置,如果你后面装了多个版本的JDK想灵活切换,路径就会比较混乱。我在生产环境的机器里见过用rpm装了不同厂商JDK后,alternatives命令配置乱掉的情况。所以,对于希望搞清楚“JDK到底装在哪”的人来说,rpm方式不是最优解。

3.2 tar.gz安装:最推荐的方式,全程可控

tar.gz方式本质上就是“解压 + 配置环境变量”,步骤清晰,位置可控,也是大多数老运维最喜欢的方式。首先是解压:

cd ~/tools tar -zxvf jdk-8u281-linux-x64.tar.gz

执行完以后,当前目录下会出现一个jdk1.8.0_281文件夹,里面就是JDK的完整内容。我习惯把JDK统一放到/usr/local/java目录下管理,这样多个版本之间容易区分。

sudo mkdir -p /usr/local/java sudo mv jdk1.8.0_281 /usr/local/java/

这里有个小细节,如果你下载的包是.tar.Z之类的旧压缩格式,tar -zxvf可能会失败,因为-z参数是给gzip压缩的,如果你不确定压缩格式,可以直接用tar -xvf,它会自动识别。不过最常见的还是.tar.gz,正常执行即可。

直到这一步,JDK已经“能用了”,你如果直接运行/usr/local/java/jdk1.8.0_281/bin/java -version,应该能看到版本信息。但为了让系统任何位置都能直接调用java和javac,我们还需要配置环境变量,这一步放在后面第四章单独讲。

3.3 yum安装OpenJDK:方便但不太能满足“装JDK 1.8”的执念

再补充一种最偷懒的方式,如果你不想手动管理安装包:

yum install -y java-1.8.0-openjdk.x86_64

一条命令的事情,系统会从软件源下载OpenJDK并自动配好环境变量,装完就能跑。但注意,这只是OpenJDK,不是官方发的Java SE版本。虽然大多数日常学习场景下功能上没有什么区别,但如果你照着一本讲“Java SE”的教程去对比目录结构,就会发现OpenJDK的安装路径、模块布局和官方包不完全一致,有些教程里提到的管理工具或者类路径设置会显得对不上。

如果你是个人学习、不想折腾,那yum方式完全没问题。但如果你希望自己的学习环境和很多公司生产环境保持一致,还是推荐前面下载官方tar.gz包的做法,毕竟这是一种“所见即所得”的部署方式。

4. 环境变量配置是重头戏,写错一个字都可能出问题

JDK文件本身解压完其实已经可以运行了,但如果你不想每次都敲一长串绝对路径,环境变量这步就必须做好。这也是整个安装过程中出错概率最高的环节。别担心,只要理解每个变量的作用,你就能自己排查问题。

4.1 JAVA_HOME、PATH、CLASSPATH 各自是干嘛的

环境变量里核心的有三个,我用最直白的方式解释一下。

JAVA_HOME:告诉系统JDK安装在哪里。很多Java中间件、构建工具(比如Maven、Tomcat)都会从JAVA_HOME去定位JDK路径,如果这个变量没配好,这些工具会直接起不来。

PATH:这是Linux系统非常重要的一部分,它定义了终端执行命令时的查找范围。我们输入java的时候,系统会去PATH列出的目录里找有没有名为java的可执行文件,找到了,就执行。所以我们要把$JAVA_HOME/bin这个目录加进PATH前面,系统才能第一时间找到java和javac。

CLASSPATH:这个变量在JDK 1.8时代依然有一些意义,它告诉Java虚拟机到哪里去找用户自己定义的类。在旧教程里,配置标准往往是:

export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

这里开头的.表示当前目录,否则你编译了源代码之后运行class文件时,JVM可能找不到同一个目录下的类。不过在JDK 9之后,类库的组织方式变了,CLASSPATH的概念也弱化了很多,而很多现代开发用Maven/Gradle也不太依赖这个变量。所以我的建议是:在JDK 1.8环境里,配置了也不算错,但如果你记不住那一长串,只配置JAVA_HOME和PATH其实也完全够用。

4.2 推荐存放在 /etc/profile.d 下,而不是直接改 /etc/profile

网上大量教程会让你直接编辑/etc/profile,在文件末尾追加一行export。这个方法本身没错,但我觉得有更好的实践方式。/etc/profile.d/目录是专门用来存放各个软件的环境变量配置文件的,系统登录时会自动遍历执行这些脚本。

于是我们可以新建一个独立文件:

sudo vi /etc/profile.d/java.sh

然后在里面写入:

export JAVA_HOME=/usr/local/java/jdk1.8.0_281 export PATH=$JAVA_HOME/bin:$PATH export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

保存退出后,执行:

source /etc/profile.d/java.sh

这样做的优势很明显:一是不会对大文件/etc/profile反复横加修改,出问题容易回溯;二是如果以后装多个JDK想切换,我只需要改一个文件里的JAVA_HOME,其他模块的脚本不用动。这个思路在管理服务器多软件环境时真的很有用。

4.3 配置完一定要 source,但source只影响当前会话

新手最容易忽略的是source这一步。我们写进/etc/profile.d/java.sh的内容是登录时要读取的,但如果你已经在当前终端打开着,当前shell并不会自动重新读取这个文件,所以要手动执行source让变量立即生效。如果你关闭终端重新开一个,一般也会生效。

也有一些教程会让你直接执行. /etc/profile,这跟source /etc/profile是一样的。但如果你的配置文件写错了,比如JAVA_HOME路径不存在,source之后马上就会看到报错。这时候不要慌,报错信息恰恰是在告诉你哪个变量有问题,回到java.sh里检查即可。

重要提醒:在配置PATH时,千万记得保留原有的$PATH。有些人图省事写成了export PATH=$JAVA_HOME/bin,把原PATH覆盖掉了,结果就是ls、vim等基础命令全部找不到,甚至可能连sudo都用不了,场面相当尴尬。万一你不小心把PATH搞丢了,可以临时执行export PATH=/usr/local/bin:/usr/bin:/bin把最基本路径先找回来。

5. 验证与常见问题排查实录

配置完环境变量,别急着跑去写代码,先把安装结果验证一遍。这一步也是很多人草草了事的地方,结果后面真遇到问题才发现根源在安装阶段就埋下了。

5.1 安装完成后的标准四条验证命令

打开新的终端窗口,依次执行下面命令:

java -version javac -version echo $JAVA_HOME which java which javac

正常情况下,java -version和javac -version都会输出1.8.0_281之类的版本信息,echo $JAVA_HOME输出刚才配置的路径,which java和which javac则指向/usr/local/java/jdk1.8.0_281/bin/java。这四条命令的输出如果全部正常,那就说明基础环境已经OK了。

which java这一步很多人会忽略,但它能帮你发现是否被系统自带的旧版本干扰。有时候你明明装了新JDK,一执行java -version却弹出一个很老的版本,多半是系统路径里有别的JDK,而它的目录排在了$JAVA_HOME/bin前面。这时候你就得检查PATH的顺序,把$JAVA_HOME/bin放最前面。

5.2 高频问题速查表

我把平时接待咨询时遇到的典型问题整理成一个速查表,方便你按图索骥:

现象可能原因解决办法
java -version 正常,javac 找不到只下载并安装了JRE,而不是JDK;或PATH里未包含JAVA_HOME/bin回到第2.2节,下载真正的JDK包;检查环境变量PATH是否写入了$JAVA_HOME/bin
打开新终端,JAVA_HOME为空source只对当前会话生效;图形界面终端可能没有重新加载profile确认配置写入了/etc/profile.d/或/etc/profile;关闭重开终端,或手动source后再测
所有基础命令找不到环境变量里PATH配置覆盖了原PATH手动执行export PATH=/usr/local/bin:/usr/bin:/bin救急,再修复java.sh
系统里多个JDK版本,java -version指向错误版本PATH顺序问题,或alternatives软链干扰检查which java路径;调整JAVA_HOME和PATH顺序;必要时用alternatives --config java
解压后在 /usr/local/java 目录下找不到文件夹用户权限不够,或解压命令执行路径不对检查当前目录,用pwd确认;确认用的是sudo mv,或确保对/usr/local有写权限
java -version报No such file or directory包架构与系统不匹配用uname -m确认系统位数,重新下载对应版本

5.3 虚拟机环境特有的两个注意点

既然标题里提到了VMware,我单独说一下和虚拟机使用相关的两个小细节,我自己踩过之后觉得非常值得写下来。

第一个是快照回滚后JDK消失。如果你在安装JDK之前创建了VMware快照,装完之后又回滚到旧快照,那么所有安装工作都会丢失,这不是安装方法的问题,而是虚拟机本身的特性。下次装完建议再打一个干净的新快照,这样后面哪怕把环境搞坏了也能快速恢复。

第二个是克隆虚拟机时容易忽略环境变量残留。如果你用VMware的克隆功能复制了一台Linux,原本某台机器上配置好的JDK路径可能会随着克隆一并复现,这对你来说其实是好事,但要注意源机器的绝对路径和主机名如果变了,某些依赖绝对路径的脚本可能需要同步更新。不过JDK本身并不依赖主机名,所以“克隆后JDK不可用”的说法是错的,真正需要担心的是克隆之后网卡配置变化导致的上网问题,跟JDK没什么关系。

# 万一你发现克隆之后java命令还能用,但自己部署的服务起不来 # 最优先检查的是服务日志里有没有报JAVA_HOME相关的路径不存在 # 然后检查/etc/profile.d/java.sh里的路径是否还真实存在

6. 从装好到会用:顺手补一句关于编译运行的小白操作

环境变量配置好之后,很多初学者下一步其实是着急写代码。我建议你用一个最简单的HelloWorld验证整个链路,顺便确认CLASSPATH的配置到底有没有问题。

mkdir -p ~/hello && cd ~/hello vi Hello.java

写入:

public class Hello { public static void main(String[] args) { System.out.println("Hello JDK 1.8"); } }

然后执行:

javac Hello.java java Hello

如果输出Hello JDK 1.8,说明编译和运行链路都是通的。有些时候你会遇到java Hello能跑通但java Hello.class却报错的情况,这是因为运行的是类名,不是文件后缀。把java Hello.class改为java Hello即可。

我个人在实际操作中的体会是:JDK安装本身真的不复杂,它考验的不是技术深度,而是细心程度。选错包、配错路径、忘加$PATH后缀,这些坑每一个都很“低级”,但几乎每一个初学者都会踩至少其中一到两个。如果你在虚拟机环境里照着做还是出问题,最有效的排查办法不是反复重装,而是先用echo $JAVA_HOME和which java确认当前系统里实际生效的路径到底是什么,然后再顺着路径一步步往下看。大多数问题,其实都出在“你以为的是A路径,系统实际用的是B路径”这种错位上。

最后再分享一个小技巧:JDK 1.8装好之后,不妨顺手在/etc/profile.d/java.sh里把JAVA_HOME写得足够明确,不要为了省事用相对路径或者~号。绝对路径多写几行字,但能避免后续在脚本、计划任务里出现各种奇怪的解析问题。这个习惯保持住了,后面在Linux上装其他软件、配数据库、部署中间件,你都会顺手很多。

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

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

立即咨询