首页 / 资讯中心 / 文章详情

Linux手动安装JDK 1.8(8u45)tar.gz:环境配置与排错全解析

Linux手动安装JDK 1.8(8u45)tar.gz:环境配置与排错全解析 ★ FEATURED ARTICLE
简介JDK 1.8 64位官方正式版jdk-8u45-linux-x64.tar.gz是Oracle面向64位Linux系统发布的Java开发工具包适合需要在服务器或个人开发机上搭建标准Java环境的开发者、运维人员使用。该版本承载了Java 8最具代表性的新特性包括Lambda表达式、Stream API、CompletableFuture异步编程模型以及java.time日期时间库能有效简化集合处理、并发任务与时间操作提升代码可读性与运行效率。压缩包共含1666个文件以jar库文件、xml配置、so动态链接库、properties环境配置及png、html说明文档为主体整体约165.24MB解压后即可获得javac编译器、JRE运行环境、javadoc文档生成器、JMC监控中心等完整组件同时附带man手册与安全策略文件便于查阅和定制。已有3259人学习下载适合需要快速上手Java 8开发环境的初中级开发者借助完整的官方目录结构可少走弯路直接进入编码与调试阶段。1. 一份 8u45 的 tar.gz为什么到现在还有人找帮某老项目搭一套全新的 Linux 编译环境装完依赖、拉完代码最后卡在 JDK 上——项目里所有脚本都按 1.8 写的pom 里硬编码了 source/target 1.8生产包用的也是 1.8 编译产物。我拿出这份 jdk-8u45-linux-x64.tar.gz解压、配环境变量、跑 java -version前后不到三分钟整个编译链路就通了。这不是什么新鲜东西但越老的东西越讲究装得对不对。JDK 1.8 是 Java 生态里少见的「版本钉子户」大量金融、政务、传统企业的存量系统跑在它上面不是因为新版本不好而是迁移成本高到没人愿意动。这份 8u45 的 Linux 64 位 tar.gz 解决的是最朴素的需求在一台干净的 Linux 机器上快速获得一个可用的 JDK 1.8 运行时和编译环境。适合三类人——正在复现老项目构建流程的开发者、维护存量服务器需要替换 JDK 的运维、以及跟着老教程一步步搭环境的新手。下面全文围绕这份 tar.gz 展开怎么选型、怎么装、怎么验证、常见坑在哪、怎么让它和别的 JDK 版本共存。我按自己实际操作的顺序写每一步都是验证过的。2. 为什么是 JDK 1.8以及 8u45 这个版本号意味着什么2.1 版本僵局不是不想升是不敢动JDK 1.8 发布至今周围的新项目已经普遍用 11、17 甚至 21但存量系统对 1.8 的依赖不是技术选择而是业务约束。我接触过的几个老系统要么是用 1.8 的特定语法写的代码要么是依赖了只在 1.8 下正常工作的第三方库要么是运维侧的安全策略只审批过 1.8 的运行时。升级一个版本意味着要重新过一遍全链路的兼容性测试这个成本对稳定优先的系统来说是不可接受的。所以「装 JDK 1.8」这件事本质上是在给老系统提供它赖以运行的底座。它不是新鲜事但做错一步——比如版本不对、位数不对、路径没配对——就会让整个应用启动失败且报错信息往往让人摸不着头脑。2.2 发行版怎么选这份 tar.gz 是什么定位Linux 上装 JDK 1.8 有三条路从系统软件源装如 apt 的 openjdk、从发行版厂商下载 tar.gz 手动解压、用包管理工具拉第三方构建版本。这份 jdk-8u45-linux-x64.tar.gz 算得上是当年的官方正式版是完整的 JDK 而非 JRE包含 javac、jar、javadoc 等全套开发工具64 位架构适用于绝大多数 x86_64 的 Linux 服务器。选它而不是用 apt 直接装 openjdk常被忽略但也最实际的理由是版本可控、路径可控。apt 源里的版本跟着系统发行版走今天装的和三个月后装的可能不是同一个更新级别而手动解压 tar.gz 可以把 JDK 固定在某个精确版本上这对复现构建环境至关重要。还有一个实际考量是目录结构。tar.gz 解压后就是一个独立的 jdk1.8.0_45 目录所有文件都在自己家里卸载就是删目录不会像包管理器那样散落一堆配置和链接。对于要精确控制环境的场景这个特性比省几步命令值钱得多。2.3 8u45 的边界能做什么不能做什么8u45 是 2015 年上半年的更新版本。放在今天看它有几个明确的边界支持编译和运行 Java 8 语法的代码包括 lambda、Stream API、接口默认方法、新的日期时间 API。可以正常跑绝大多数基于 Spring Boot 1.x/2.x、Struts、老版 Dubbo 等项目构建的产物。不能运行 class 文件版本号高于 52 的代码也就是用 JDK 9 以上编译出来的东西在 8u45 上会直接抛 UnsupportedClassVersionError。不包含后续 8u 版本里修复的大量安全漏洞。如果部署到公网环境建议装完系统后评估是否需要升级到更高的小版本。这个包适合的场景是「内部构建、离线环境、复现老项目」。如果是要新上线一个面向公网的服务我会优先找 8u202 或更晚的版本而不是用 8u45。3. 在 Linux 上装好这份 JDK 1.8解压、路径与三个环境变量3.1 拿到 tar.gz 之后先做这三件事我把这份包从存储里拿出来后的第一步不是解压而是先校验文件完整性和确认架构。tar.gz 在传输过程中损坏的概率不高但一旦包损坏解压时可能不报错装完才发现缺了关键文件那才叫折腾。# 1. 看文件大小和 MD5和发布页核对 ls -l jdk-8u45-linux-x64.tar.gz md5sum jdk-8u45-linux-x64.tar.gz # 2. 确认当前系统架构是 x86_64 uname -m # 3. 解压到 /usr/local/java固定一个不被系统包管理器干扰的目录 sudo mkdir -p /usr/local/java sudo tar -xzf jdk-8u45-linux-x64.tar.gz -C /usr/local/java三件事各有用意ls -l和md5sum用来确认下载过程没有丢字节uname -m输出是x86_64才能对应上这个 x64 包某些 ARM 服务器拿到 x64 包解压是能成功的但一运行就报Exec format error这个坑我踩过解压到/usr/local/java是把 JDK 放在系统级目录避免解压到用户目录后权限和路径的各种麻烦。解压完成后应该能看到/usr/local/java/jdk1.8.0_45这个目录。检查一下 bin 子目录里有没有 javac 和 java没有的话说明包不完整趁早重新下载。3.2 JAVA_HOME、PATH、CLASSPATH 的配置逻辑环境变量是整个安装过程里最容易翻车的地方。JDK 正常运行只需要 JAVA_HOME 和 PATHCLASSPATH 在 Java 9 之后已经不太需要手动配但 1.8 时代的很多老教程还带着它我一般写上避免某些老脚本找不到依赖。# 编辑 /etc/profile让所有用户生效 sudo vi /etc/profile # 在文件末尾追加以下内容 export JAVA_HOME/usr/local/java/jdk1.8.0_45 export PATH$JAVA_HOME/bin:$PATH export CLASSPATH.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar保存后执行source /etc/profile让配置立即生效然后echo $JAVA_HOME确认输出为/usr/local/java/jdk1.8.0_45。这里有两个说明。PATH 里把$JAVA_HOME/bin放在最前面是为了让系统优先找到我们自己装的 JDK而不是/usr/bin/java指向的旧版本——这一点后面第 5 章会详细讲。CLASSPATH 最前面的.代表当前目录老版本 Java 运行 class 文件时默认不会搜当前目录之外的地方有这个点才能直接java 类名跑起来dt.jar 和 tools.jar 是 1.8 的编译辅助库系统里跑老构建脚本时偶尔有代码直接引用这两个 jar 里的类配上了省一桩心事。这段配置对新手有个常见误区很多人只改 PATH 不导 JAVA_HOME结果某些框架启动脚本只认 JAVA_HOME最后java -version正常但应用就是起不来。两个变量一起配别偷懒。3.3 用 update-alternatives 做系统级接管curl 已经自己带了一份 JDK或者系统里之前被 apt 装过 openjdk装完我们的 tar.gz 后可能会发现java -version指向的还是老版本。Debian/Ubuntu 系可以用 update-alternatives 来做系统级的切换比手动改 PATH 更干净。# 注册我们自己的 JDK sudo update-alternatives --install /usr/bin/java java /usr/local/java/jdk1.8.0_45/bin/java 100 sudo update-alternatives --install /usr/bin/javac javac /usr/local/java/jdk1.8.0_45/bin/javac 100 # 查看当前优先级并手动选择 sudo update-alternatives --config java--install的三个参数分别是链接路径、服务名、实际程序路径最后的 100 是优先级数字。多个 JDK 并存时优先级高的会被自动选中也可以手动执行--config java在列表里挑。对服务器环境我通常一步到位配好 /etc/profile 的全局变量再顺手把 alternatives 也注册了双保险避免某些服务用绝对路径/usr/bin/java找到旧版本。这个步骤对只在一台机器上装单 JDK 的人不是必需的但对要在多环境反复切换的人来说几乎是唯一正解。4. 验证安装没白装命令行检查与最小可运行 Demo4.1 java -version 看到的信息怎么读配置完成后的第一件事是验证但很多人验证的方式不对。java -version输出的三行信息每一行都有用java -version # 输出示例 # java version 1.8.0_45 # Java(TM) SE Runtime Environment (build 1.8.0_45-b15) # Java HotSpot(TM) 64-Bit Server VM (build 25.45-b02, mixed mode)第一行1.8.0_45确认了版本和更新级别第三行64-Bit Server VM确认了是 64 位 JVM——如果这里显示32-Bit或Client VM说明你拿到的包或者系统环境有问题老项目在 32 位 JVM 下跑经常出现堆内存上不去的问题直接卡死。mixed mode表示解释器和 JIT 编译器混合运行这是 1.8 的默认模式不用管它。这一步还应该顺手验证 javac 版本因为很多编译脚本调用的是 javac 而不是 javajavac -version # 输出javac 1.8.0_45如果 java 版本对但 javac 版本不对多半是 PATH 里的 javac 来自其他位置用which javac看一眼路径就能定位。4.2 用 javac 跑通第一段代码环境变量配好、版本号正确还不代表编译链路是通的。我习惯在 /tmp 下写一个最小程序走一遍 javac java 的完整流程确保 tools.jar 引用和 CLASSPATH 设置没有隐藏问题。public class JdkCheck { public static void main(String[] args) { // 用 Java 8 的 lambda 特性验证编译器和运行时都对 Runnable task () - System.out.println(JDK 1.8 ok, path: System.getProperty(java.home)); new Thread(task).start(); } }cd /tmp javac JdkCheck.java java JdkCheck # 输出JDK 1.8 ok, path: /usr/local/java/jdk1.8.0_45代码里特意用了 lambda 表达式——这是 Java 8 的核心新特性如果编译阶段报「不支持 lambda」说明 javac 调用的不是 1.8如果编译通过但运行时抛NoClassDefFoundError说明 CLASSPATH 或者运行时路径有问题。输出里的java.home能进一步确认 JVM 是从我们指定的目录加载的。跑通这段就能确定从编译到运行的整个链路都是可用的。后面的应用部署如果还出问题基本跟 JDK 安装无关。4.3 在应用配置里点名 JDK 路径如果是 Tomcat、某个启动脚本或者 systemd 服务建议在配置文件里显式指定 JAVA_HOME不要赌全局环境变量在服务启动时一定被加载。# 以 Tomcat 的 setenv.sh 为例新建或编辑该文件 export JAVA_HOME/usr/local/java/jdk1.8.0_45 export PATH$JAVA_HOME/bin:$PATH export CATALINA_HOME/opt/apache-tomcat-8.5.100systemd 服务则在 service 文件里加EnvironmentJAVA_HOME/usr/local/java/jdk1.8.0_45这种做法不算聪明但极其稳。很多服务通过 systemd 启动时不读 /etc/profile如果只靠全局配置服务起不来你都不知道去哪查。显式指定后日志里的报错至少能少一大半。5. 装 JDK 路上的常见坑五条实测排错记录5.1 解压后 java 命令找不到现象tar 解压完目录结构正常但终端里敲java -version提示 command not found。原因/etc/profile 改了但当前 Shell 没有重新加载或者 PATH 里$JAVA_HOME/bin没有被正确展开。解决先执行source /etc/profile再试一次。如果还不行echo $PATH看有没有/usr/local/java/jdk1.8.0_45/bin没有的话检查 /etc/profile 里有没有写错路径比如多写了个斜杠、少写了一个字母。再不行就export PATH/usr/local/java/jdk1.8.0_45/bin:$PATH手动加一次确认能跑后再回过去修配置文件。5.2 java -version 显示的是旧版本现象Java 能跑但版本是 1.7 或 11不是刚装的 1.8.0_45。原因/usr/bin/java被系统自带的 openjdk 或之前装的 JDK 占用了而 PATH 里$JAVA_HOME/bin排在后面Shell 先找到了/usr/bin/java。解决把$JAVA_HOME/bin放到 PATH 最前见 3.2 节同时用which java确认实际找到的是哪个路径。如果/usr/bin/java仍然捣乱直接改 alternatives 优先级或者备份 /usr/bin/java 后替换成软链。5.3 tar.gz 包下载不完整解压时不报错现象解压全程正常但 javac 或 java 执行时提示缺少文件、段错误或者某些工具 bin 目录下直接没有可执行文件。原因tar.gz 在传输过程中字节丢失部分文件被解压成了空文件。tar 命令对这种损坏有一定容忍度不一定报错。解决下载后先核对 md5 或 sha256这是最可靠的方案。已经解压的可以对比 bin 目录下文件数量和发布页的清单经验值是一份完整的 JDK 8 Linux x64 包解压后文件数在 4000 个上下如果明显少很多重新下载解压。5.4 老项目报 UnsupportedClassVersionError现象项目编译产物在启动时报类似unsupported class file version 55.0的错误。原因这个错误提示的是 JVM 版本低于 class 文件编译版本。55.0 对应 Java 11说明代码是用更高版本 JDK 编译的而当前运行时是 Java 8。解决要么用 JDK 8 重新编译源码在 pom.xml 里锁定maven.compiler.source1.8/maven.compiler.source要么确认启动脚本的 JAVA_HOME 指向了正确的 1.8 路径。注意检查是不是启动脚本里加载了别的 JDK这比改代码常见得多。5.5 环境变量写错导致启动脚本连锁失败现象Tomcat 或某个 Java 应用服务启动时日志提示Cannot find ./catalina.sh或JAVA_HOME not set但终端里 java 明明能跑。原因启动脚本可能是通过相对路径或固定的 /etc/profile 加载机制去找 JAVA_HOME而我们配置的路径写错了或写到了不生效的文件里。解决在启动脚本最前面加一行echo $JAVA_HOME直接看输出。如果为空说明脚本执行环境没加载我们的配置。对 systemd 服务在 service 文件里显式写EnvironmentJAVA_HOME...见 4.3对手动启动脚本在文件开头直接 export JAVA_HOME 和 PATH不依赖全局配置。6. 让老版本活得更稳双 JDK 切换与升级路径6.1 用 alternatives 做双版本切换我已经不止一次遇到同一台机器上要跑两个不同 JDK 版本的情况——一个老系统锁死 1.8一个新工具必须要 11。在这种情况下不要反复改 /etc/profile那是最原始也最容易出错的方式。用 update-alternatives 把两个版本都注册进去切换就变成一条命令的事。# 注册 JDK 1.8 sudo update-alternatives --install /usr/bin/java java /usr/local/java/jdk1.8.0_45/bin/java 100 sudo update-alternatives --install /usr/bin/javac javac /usr/local/java/jdk1.8.0_45/bin/javac 100 # 注册 JDK 11假设解压在 /usr/local/java/jdk-11 sudo update-alternatives --install /usr/bin/java java /usr/local/java/jdk-11/bin/java 110 sudo update-alternatives --install /usr/bin/javac javac /usr/local/java/jdk-11/bin/javac 110 # 切换 sudo update-alternatives --config java sudo update-alternatives --config javac优先级数字越大越优先。但注意一个问题/etc/profile 里的export PATH$JAVA_HOME/bin:$PATH和 alternatives 是两条独立的生效路径。如果 JAVA_HOME 显式指到了 1.8那不管 alternatives 怎么切终端里跑的始终是 1.8。所以双版本切换时我一般建议把 /etc/profile 里的 JAVA_HOME 注释掉完全交给 alternatives 管理。这样每次切换后立即生效不依赖重新登录。这种方式也有代价——某些框架的启动脚本会读取 JAVA_HOME 环境变量注释掉后它们就找不到 JDK。这类脚本属于少数碰上了就在脚本里单独指定 JAVA_HOME。整体上用 alternatives 管理版本更干净。6.2 8u45 升级到 8u202保留路径习惯换包如果部署的公网服务一定要用 1.8我建议把 8u45 换到 8u202 或更晚的版本——两个版本 API 完全兼容class 文件版本都是 52但后者修复了大量安全漏洞。操作不复杂下载新的 tar.gz解压到新目录改 /etc/profile 和 alternatives 里的路径重启应用。不需要改任何代码或配置。# 新增目录不覆盖旧版 sudo mkdir -p /usr/local/java sudo tar -xzf jdk-8u202-linux-x64.tar.gz -C /usr/local/java # 确认新版本 /usr/local/java/jdk1.8.0_202/bin/java -version # 更新全局配置 sudo sed -i s#jdk1.8.0_45#jdk1.8.0_202#g /etc/profile source /etc/profile java -versionsed命令把 /etc/profile 里所有jdk1.8.0_45替换成jdk1.8.0_202一步到位。替换完老的 jdk1.8.0_45 目录先留着确认应用一切正常再删这就是后悔药——删了可就没了。6.3 归档意识把 JDK 放进项目仓库这件事我在几个项目里翻过车后养成了习惯把 JDK 的 tar.gz 和安装步骤一起放进项目内部的软件仓库同时把本机安装路径写进部署文档。表面看是多余动作但实际价值在于——让下一个接手的人不再从网上找包、猜版本。某次模拟项目X的环境重建我愣是在搜寻老版本 JDK 上花了大半天问题就出在没有归档意识。从那以后我每装一次 JDK至少会在本地项目里存一份 tar.gz 和一份安装命令记录下次直接拿来用不折腾。这算是整个流程里最不起眼但最省时间的一环。也多亏了这份 8u45 的 tar.gz 本身完整可靠解压、配置、编译一路顺畅后面排查应用问题时不会被环境因素干扰省下的时间全花在了真正的问题上。希望这份笔记也能帮你把同样的路走得快一点。本文还有配套的精品资源点击获取
阅读完成 · 觉得有帮助?
咨询建站