jdk1.8.0_231安装全指南:Linux/Windows环境变量与避坑实战
简介JDK 1.8.0_231 是甲骨文公司于 2019 年发布的 Java 8 更新版适合需要搭建 64 位 Java 开发环境的开发人员与运维人员可免安装解压即用解决官方安装包下载与部署不便的问题。压缩包共 1473 个文件、约 172.9 兆字节以 jar 运行库、dll 动态链接库、exe 工具程序为主其中包含大量依赖库与配置模板另有配置与文档类文件目录结构完整便于排查运行环境问题。已有 2070 人浏览学习属于关注度较高的 64 位 JDK 资源。包内除标准运行环境外还包含任务控制、远程访问配置、安全证书库、字体配置等组件方便开发调试、性能监控及安全策略调整该版本在性能优化、稳定性与安全性上也有改进适合作为日常开发与生产环境的基础版本。zip 免安装形式也有利于在多套环境快速部署对固定使用 1.8 版本的开发者较为实用。1. 还在纠结装哪版JDKjdk1.8.0_231 这台生产服务器我用了快四年做运维的都知道新项目让你随便选 JDK 版本老项目可不管你出到 17 还是 21配置里写死的就是 Java 8。jdk1.8.0_231 是 2019 年 10 月发布的 8u 系列版本正好卡在官方调整商业许可规则之前也是很多存量系统清单上最后一批“能放心用到生产”的 1.8 版本之一。我当年给某跨平台系统做环境迁移生产环境强制锁定这个版本号连 build 号都不许换原因很简单换版本有风险不换版本心里踏实。装 JDK 这件事看着简单实际翻车点全在后面包选错位数、环境变量路径多个斜杠、旧版本没清干净导致 java -version 永远不对。这些问题新手会卡一晚上熟手也得花十分钟排查。这篇我按自己装过的完整流程来写从选包、下载校验到 Linux 和 Windows 两套环境的安装配置最后是五个典型的踩坑现场和一组验证脚本照着走完jdk1.8 安装这件事就算彻底落地了。2. 下载前的版本选择jdk1.8.0_231 的包类型和系统匹配要提前定2.1 先认清这一版的包形态tar.gz、zip、exe、dmg 和 rpm 各管什么安装 jdk1.8.0_231 之前得先知道一件事同一个版本号官方会出好几种包不是随便下一个就能用。1.8.0_231 对应的下载文件名大致是这些包名关键字适用系统使用场景linux-x64.tar.gz64 位 Linux服务器部署首选解压即用不碰发行版包管理器linux-x64.rpm64 位 Linuxrpm 系适合用 rpm 管理软件的环境装完自动写 alternativeswindows-x64.exe64 位 Windows图形化安装向导自动配注册表和环境变量部分macosx-x64.dmgmacOS双击安装装完在 /Library/Java 下生成目录这里第一个坑就来了很多人直接搜“jdk1.8 64位下载”下回来一个 exe然后拿到 Linux 服务器上一看后缀不对白下载。我一般会先确认目标机器的操作系统和位数再回头选包。tar.gz 是我最常用的因为它不依赖发行版的包管理器解压到指定目录就能用迁移也方便。另外要留意1.8.0_231 这个版本解压出来的目录名是jdk1.8.0_231不是jdk-8u231。这个目录名后面配 JAVA_HOME 会直接用上先记在心里后面环境变量那节还要重点讲。2.2 系统位数与 libc 判断x64 还是 ARM别等解压完才发现不对选择“64 位下载”之前先核实机器到底是什么架构。x86_64 和 ARM64 的 JDK 包不通用ARM 机器上硬跑 x64 包会直接报cannot execute binary file。我常用的检查命令是uname -m # x86_64 表示 Intel/AMD 64 位 # aarch64 表示 ARM 64 位要去下 arm64 版本ldd --version | head -1 # 输出类似 ldd (GNU libc) 2.17JDK 8 对 glibc 版本比较敏感参数说明uname -m看内核架构ldd --version看 glibc 版本。jdk1.8.0_231 在 glibc 2.12 以上的系统基本没问题但如果你在太老的 CentOS 5 上装会遇到/lib64/libc.so.6: version GLIBC_2.14 not found这类报错。碰到这种情况别硬装回头看看是不是系统该升级了。还有一个小细节Linux 下如果缺 fontconfig 库JVM 启动图形相关组件时会报找不到libfontconfig.so.1。虽然大多数纯后端服务用不到但为了预防万一我通常会在装 JDK 前顺手把基础依赖补上# apt 系执行 sudo apt-get install -y fontconfig # yum 系执行 sudo yum install -y fontconfig这两条命令的作用是保证 JVM 在需要加载字体库时不报错。没有图形界面的服务器其实可以不装但装上了能少一类莫名其妙的报错属于“顺手的事”。2.3 下载与校验文件拿到手先算一次 SHA256下载渠道上优先找官方归档页或者可信的开源镜像站不要随便在第三方下。镜像站给的包名不会变还是jdk-8u231-linux-x64.tar.gz下完以后我习惯先校验哈希确认文件完整避免下到一半损坏的包。# 假设下载到 ~/downloads/ 目录 cd ~/downloads sha256sum jdk-8u231-linux-x64.tar.gz # 将输出值与官方公布的 SHA256 摘要比对一致才继续校验逻辑sha256sum计算的是整个文件的摘要。官方给的哈希值通常是一长串 64 位十六进制字符串两个值逐字符一致才是完整文件。这一步很多人跳过等到解压时报gzip: invalid compressed data才回头补校验白白浪费时间。还有一点经验下载的文件名务必保持原样不要手滑改成jdk.tar.gz。后面写自动化部署脚本时文件名里的版本号是要用来做校验和版本判断的去掉版本号等于给排查埋雷。3. Linux 服务器安装 jdk1.8.0_231解压、环境变量、多版本共存一套走完3.1 目录规划与一步解压Linux 下我通常把 JDK 放在/usr/local/java/下目录结构统一后面切换版本也方便。先创建目录再解压sudo mkdir -p /usr/local/java sudo tar -zxf ~/downloads/jdk-8u231-linux-x64.tar.gz -C /usr/local/java/命令说明-z表示通过 gzip 解压-x是解包-f指定文件名-C指定解压目标目录。解压完成后检查一下目录结构ls -l /usr/local/java/ # 应该看到 jdk1.8.0_231 这个目录 ls -l /usr/local/java/jdk1.8.0_231/bin/java # 确认 java 可执行文件存在如果之前在这个目录装过别的版本解压后会出现多个 jdk 目录并列。这时候先不要删旧的等环境变量切过去、验证没问题了再清理给自己留后悔药。tar 解压步骤虽然简单但目录权限很容易被忽略——如果是用普通用户解压到了/usr/local/java/文件属主会变成该用户后面其他用户执行 java 时可能遇到权限问题。我一般解压完顺手chown -R root:root固定属主sudo chown -R root:root /usr/local/java/jdk1.8.0_231这一步的意义在于JDK 是全局软件属主统一为 root 后所有用户都能在 PATH 中找到并执行不会因为属主混乱出现部分用户跑不了的怪异情况。3.2 配置环境变量三个最容易写错的路径环境变量配置是 jdk1.8 安装里翻车率最高的环节没有之一。常见做法是写在/etc/profile里全局生效如果只想对当前用户生效就写~/.bashrc。我服务器上习惯全局写/etc/profilesudo vi /etc/profile # 在文件末尾追加以下内容 export JAVA_HOME/usr/local/java/jdk1.8.0_231 export PATH$JAVA_HOME/bin:$PATH export CLASSPATH.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar追加完成后执行source /etc/profile让配置立即生效然后检查source /etc/profile echo $JAVA_HOME java -version这里有三个路径相关的坑我逐个说。第一个JAVA_HOME结尾不要带/bin写成/usr/local/java/jdk1.8.0_231/bin会让$JAVA_HOME/bin/java变成.../bin/bin/java命令直接找不到。第二个目录名jdk1.8.0_231是下划线分隔不是jdk1.8.0-231也不是jdk-8u231写错一个字符整个路径失效。第三个CLASSPATH开头的.:很多人会漏掉漏掉后当前目录下的 class 文件运行时JVM 默认不一定能找到。关于CLASSPATH说实话现在用 IDEA 或 Maven 的项目不太依赖这个环境变量了但命令行手工javac编译老项目时它仍然有效。我保留它的原因是为了兼容某些老的构建脚本如果你确定不碰命令行编译这行可以不写。3.3 update-alternatives 管住多个 JDK避免版本混战服务器上同时装了好几个 JDK 版本时java -version显示的往往是/usr/bin/java指向的那个。这个/usr/bin/java在 rpm 系上是个软链接它指向谁命令行就用谁。管理这些软链接我一般用update-alternativessudo update-alternatives --install /usr/bin/java java /usr/local/java/jdk1.8.0_231/bin/java 1 sudo update-alternatives --install /usr/bin/javac javac /usr/local/java/jdk1.8.0_231/bin/javac 1 sudo update-alternatives --config java命令逻辑--install把新的 JDK 注册进 alternatives 系统最后的数字是优先级数字越大越优先。--config会弹出交互式列表手动选择默认 JDK。这一步做完/usr/bin/java就指向了 jdk1.8.0_231。但要注意光配 alternatives 还不够JAVA_HOME还是要单独指过去。update-alternatives只管命令行入口很多脚本和中间件读的是JAVA_HOME环境变量两者不一致就会出现“明明 java -version 是 1.8Tomcat 却用了别的版本”的诡异现象。配完这两处后我再统一验证一次确保 command line 和 JAVA_HOME 指向同一个目录。4. Windows 安装 jdk1.8.0_231安装向导之外的三处手工活4.1 安装选项与目录选择Windows 上安装过程相对省事双击jdk-8u231-windows-x64.exe一路 Next 就能完成。但有两个位置值得手动干预。第一个是安装路径默认装在C:\Program Files\Java\jdk1.8.0_231这个路径带空格后续在命令行或脚本里遇到不带引号的路径时很容易出问题。我习惯改成D:\Java\jdk1.8.0_231这类无空格路径代价是没有收益是后面的配置少踩一个坑。第二个是安装过程中弹出的“目标文件夹”窗口它有时候会提示安装 JRE。JDK 1.8 的安装包默认会带一个独立的 JRE如果你不需要运行小程序或浏览器插件把 JRE 那个勾选去掉也行。不过考虑到有些老 Tomcat 会直接认JRE_HOME我还是建议把 JRE 一起装上省得后面补装更麻烦。安装完成后手动验证一下目录dir D:\Java\jdk1.8.0_231 # 确认 bin 目录下存在 java.exe、javac.exe很多人的习惯是装完直接下一步从不看目录内容等到javac 不是内部或外部命令的报错弹出来才开始找原因。装完多看一眼目录能省十分钟。4.2 手动配置 JAVA_HOME 和 PATHcmd 里别再写错引号Windows 的图形化安装向导不会自动配置JAVA_HOME和PATH这两项要手动去“系统属性—环境变量”里加。流程是固定的新建系统变量JAVA_HOME值填D:\Java\jdk1.8.0_231然后编辑Path在最前面追加%JAVA_HOME%\bin。这里有个顺序问题值得注意%JAVA_HOME%\bin要放到 Path 的开头而不是末尾。如果系统里已经有别的 JDK 路径命令行执行 java 时是按 Path 顺序从前到后找的新加的放在后面找到的还是旧版本。改完环境变量后所有已打开的 cmd 窗口都不会生效必须新开一个窗口。这个“新开窗口才生效”的机制坑过很多人——配完了在当前窗口敲 java -version发现还是旧的就以为配置失败了其实只是没重开窗口。PowerShell 用户要额外注意一点新窗口执行java -version后检查输出里的路径是否包含D:\Java\jdk1.8.0_231。如果命令输出版本号正常但路径指向了别处说明 Path 里还有其他值在捣乱用where java查看实际命中的位置where.exe java # 输出所有被 Path 匹配到的 java.exe 位置排在最上面的是实际生效的4.3 字符集与 javac 编译老项目的 GBK 问题Windows 上安装 jdk1.8.0_231 之后最容易遇到的运行时报错不是版本问题而是编码问题。默认情况下Windows 中文系统使用 GBK 编码而 JDK 8 的编译器默认按平台编码读取源文件。当一个项目源码是 UTF-8 时直接用javac编译大概率报“编码 GBK 的不可映射字符”。这不是 JDK 版本缺陷是字符集匹配问题。规避方法是编译时显式指定编码或者设置环境变量javac -encoding UTF-8 HelloWorld.java如果项目里有大量老代码且统一为 GBK就不加这个参数保持默认。这个细节在 Windows 下装 JDK 后很实用因为同样的代码放到 Linux 服务器上能正常编译放回 Windows 就报错容易让人误以为是 JDK 装坏了。实际上从 jdk1.8.0_231 的验证角度来说只要 javac 能编译、java 能运行安装就是成功的编码问题是项目层面的事情不要混为一谈。5. 安装避坑五个翻车现场、原因和后悔药5.1 现象java -version 显示的永远是旧版本有一次我给某模拟项目X装完 jdk1.8.0_231JAVA_HOME配得清清楚楚source也执行了一敲java -version居然还是 1.7。原因系统里/usr/bin/java指向了旧 JDK而PATH里/usr/bin在$JAVA_HOME/bin前面shell 优先找到了旧文件。解决用which java看实际路径再用update-alternatives --config java切到新版本或者把$JAVA_HOME/bin在 PATH 里前移。从那以后我配置完一定先which java不只看 version。5.2 现象环境变量配了新开终端还是找不到 java这个坑我在 Windows 和 Linux 都踩过。Linux 下把配置写进了/etc/profile当前 shellsource后一切正常可一旦新开一个 SSH 会话提示java: command not found。原因非登录 shell 只加载~/.bashrc不读/etc/profile。解决把环境变量同时写到~/.bashrc或者写入/etc/profile.d/java.sh这样的独立脚本确保所有会话都能加载。这个文件在多数发行版上是登录时统一加载的比直接改/etc/profile更干净。5.3 现象解压完发现 /usr/local/java 目录权限不对有次用普通用户执行了解压命令结果整个 jdk1.8.0_231 目录的属主都变成了那个用户其他账号执行 java 时能读到版本号但无法创建临时文件某些服务起不来。原因tar 解压保留了原始属主或者当前用户无权限写入/usr/local导致解压不完整。解决解压前先sudo mkdir并chown目标目录解压后统一chown -R root:root。这个操作我每次都会做已经变成肌肉记忆。5.4 现象安装完成后 CLASSPATH 配错引发的 NoClassDefFoundError这个现象迷惑性很强。java -version 正常编译也正常一运行就报java.lang.NoClassDefFoundError但其实程序本身没问题。排查发现CLASSPATH里写错了路径比如/usr/local/java/jdk1.8.0_231/lib/tools.jar漏写了。JVM 启动时按 CLASSPATH 找类找不着就抛这个异常。解决确认dt.jar和tools.jar的路径真实存在或者干脆不设 CLASSPATH依赖项目自己的构建工具管理类路径。很多报错其实不是 JDK 的问题是环境变量里某个 jar 路径失效了属于典型的“环境变量背锅”场景。5.5 现象Linux 发行版自带的 OpenJDK 和官方 JDK 混装服务器上本来有发行版自带的 OpenJDK我装完 jdk1.8.0_231 后java -version显示的提供商还是原来的。原因发行版的java-1.8.0-openjdk通过 alternatives 注册过优先级更高。解决用update-alternatives --config java手动切换或者干脆卸载发行版 JDK避免两套并存干扰判断。这里要特别说明卸载前先确认有服务在用旧 JDK别直接删否则依赖它的服务会集体起不来。6. 装完怎么验证编译、字节码、JVM 参数三层确认装完 jdk1.8.0_231 后只敲一句java -version我觉得不够。版本号只能证明“有 java 这个命令”不能证明编译器和运行时都工作正常。我习惯用一套固定流程做三层验证。第一层写一个最简单的 Java 文件走一遍完整的编译和运行路径public class HelloJdk { public static void main(String[] args) { System.out.println(JDK 1.8.0_231 OK, vendor: System.getProperty(java.vendor)); } }javac HelloJdk.java java HelloJdk # 预期输出JDK 1.8.0_231 OK, vendor: xxx这一段能同时验证javac和java两个命令是否可用以及运行时是否能正确加载类。第二层用 javap 看字节码确认编译器产生的 class 文件是 52.0 版本对应 Java 8javap -verbose HelloJdk.class | grep major version # 输出 major version: 52major version 52是 Java 8 的字节码版本号看到 52 就说明当前 javac 确实是 1.8 系列没被其他版本顶替。这个检查能识别出“java -version 显示 1.8但 javac 是别的版本”的错位情况。第三层确认 JVM 实际运行参数比如默认堆大小java -XX:PrintFlagsFinal -version 21 | grep -E InitialHeapSize|MaxHeapSize这一步的意义在于验证 JVM 能正常读取机器资源并生成默认配置。很多服务起不来不是 JDK 没装好是 JVM 参数异常这行命令能提前暴露问题。最后补一个习惯性的动作验证完版本后我会顺手写一个java_home.sh脚本放到/usr/local/bin下内容就是打印当前生效的JAVA_HOME和java -version。以后排查环境问题时一行命令就能看到现状不用每次现敲三条。从那以后我每次配置完 JDK都强制自己完整走一遍编译、字节码、JVM 参数这套流程用三层确认代替单纯的版本检查。希望帮到你。本文还有配套的精品资源点击获取