Ubuntu/Debian系统通过apt安装与配置OpenJDK 8完整指南 📅 2026/8/14 9:24:39 1. 项目概述与核心价值最近在帮几个刚接触Linux开发环境的朋友配置Java环境发现一个挺有意思的现象很多人一提到在Ubuntu或Debian这类系统上装JDK第一反应还是去Oracle官网下载.tar.gz包然后手动解压、配置JAVA_HOME和PATH。这当然没问题但过程繁琐而且后续管理比如升级、卸载也不够优雅。实际上对于像JDK 8这样经典的版本利用系统自带的包管理工具apt来安装才是更高效、更“Linux范儿”的做法。今天要聊的就是如何通过apt这条“高速公路”快速、干净地安装JDK 8并把它稳稳地设置为系统默认的Java运行时。这个操作的核心价值在于“标准化”和“可维护性”。通过apt安装JDK会被系统包管理器正式接管。这意味着你可以用apt update、apt upgrade来统一管理所有软件包包括Java的更新。设置系统默认Java则确保了当你直接在终端输入java或javac命令时系统能准确无误地调用你指定的JDK 8版本避免因为多个Java版本共存而引发的“命令未找到”或版本错乱的尴尬。无论是运行一个简单的Spring Boot应用还是编译一个古老的Maven项目一个稳定、明确的Java环境都是高效工作的基石。2. 环境准备与包源解析在动手之前我们得先搞清楚apt从哪里获取JDK 8的安装包。不同于一些新潮的软件OpenJDK 8在较新的Ubuntu版本如22.04 Jammy Jellyfish的默认仓库中可能已经不再提供了因为它的维护重心转移到了更新的LTS版本。但这不意味着我们装不了只是需要添加正确的软件源。2.1 更新本地包索引无论进行什么apt操作第一步永远是更新本地软件包列表这能确保我们获取到源服务器上的最新信息。sudo apt update这个命令会从/etc/apt/sources.list文件及/etc/apt/sources.list.d/目录下的所有源中拉取最新的软件包列表信息。你可以把它理解为去图书馆前先查一下最新的图书目录。2.2 添加包含JDK8的软件源对于Ubuntu 18.04及以上版本我们需要添加一个专门维护旧版OpenJDK的PPAPersonal Package Archive仓库。这里我推荐使用openjdk-r团队的PPA它维护得比较稳定。sudo add-apt-repository ppa:openjdk-r/ppa执行这条命令后系统会自动下载这个PPA的GPG密钥并添加到可信密钥链中同时将对应的源地址写入/etc/apt/sources.list.d/。完成后别忘了再次sudo apt update让新添加的源生效。注意添加第三方PPA存在一定的安全风险理论上你需要信任这个源的维护者。openjdk-r/ppa是一个社区公认的比较可靠的源。如果你在严格的生产环境中可能会倾向于从官方渠道下载TAR包进行手动安装但那样就失去了apt管理的便利性。这是一个典型的便利性与控制权之间的权衡。2.3 可选直接安装来自Ubuntu默认源的OpenJDK 11/17在执行下一步之前我想插一个很重要的实操心得。如果你的系统是Ubuntu 20.04或22.04并且你运行apt search openjdk-8-jdk发现找不到包那么上述添加PPA的步骤就是必须的。但是你也可以顺便看看系统默认提供了哪些JDK版本apt search openjdk-.*-jdk | grep ^openjdk你可能会看到openjdk-11-jdk、openjdk-17-jdk甚至openjdk-21-jdk。如果你的项目能兼容这些更新版本的JDK我强烈建议优先考虑它们。因为更高版本的OpenJDK通常包含更多的性能优化、安全补丁和新特性比如JDK 11的ZGC垃圾收集器、JDK 17的密封类等。只有当你的项目强依赖JDK 8的特定行为或API时比如一些遗留系统才必须锁定在JDK 8。3. 核心安装与配置流程假设我们已经成功添加了包含OpenJDK 8的源接下来就是安装和配置的核心步骤。3.1 安装OpenJDK 8开发套件我们需要的不仅仅是JREJava运行时环境而是完整的JDKJava开发工具包因为它包含了编译Java源码所需的javac等工具。sudo apt install openjdk-8-jdk这个openjdk-8-jdk是一个元包meta-package它会自动拉取所有相关的依赖包包括openjdk-8-jre-headless无头环境下的JRE用于服务器。openjdk-8-jre完整的JRE。openjdk-8-jdk-headless无头环境下的JDK。以及其他一些工具包。安装过程通常很快。完成后你可以通过以下命令验证安装是否成功以及安装的准确路径java -version javac -version如果安装成功java -version会输出类似“openjdk version 1.8.0_412”的信息。但请注意此时这个Java版本可能还不是系统的“默认”版本。3.2 理解Java版本切换机制update-alternativesLinux系统尤其是Debian/Ubuntu系管理多个同类型软件如多个Java版本、多个编辑器的默认选择是通过一个叫做update-alternatives的机制实现的。它本质上是一个维护符号链接symlink的系统。当我们安装多个JDK时比如系统自带的OpenJDK 11和我们刚装的OpenJDK 8/usr/bin/java和/usr/bin/javac这些命令其实都是指向/etc/alternatives/java和/etc/alternatives/javac的符号链接。而/etc/alternatives/下的这些链接又由update-alternatives系统管理指向具体某个Java版本的二进制文件。你可以用以下命令查看当前java命令的所有备选方案及其优先级sudo update-alternatives --config java执行后你会看到一个数字列表例如There are 2 choices for the alternative java (providing /usr/bin/java). Selection Path Priority Status ------------------------------------------------------------ * 0 /usr/lib/jvm/java-11-openjdk-amd64/bin/java 1111 auto mode 1 /usr/lib/jvm/java-11-openjdk-amd64/bin/java 1111 manual mode 2 /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java 1081 manual mode Press enter to keep the current choice[*], or type selection number:这里显示系统当前有2个Java版本可选。星号(*)在Selection 0上表示当前处于“自动模式”且自动选择了优先级Priority最高的java-11-openjdk-amd64优先级1111。我们安装的JDK 8也在列表中优先级是1081。3.3 将JDK 8设置为系统默认我们的目标是将默认选择切换到JDK 8。有两种方法方法一交互式配置推荐直接运行上面的命令然后输入JDK 8对应的选择编号本例中是2按回车即可。方法二非交互式配置如果你需要在脚本中自动化完成这个设置可以使用--set参数sudo update-alternatives --set java /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java sudo update-alternatives --set javac /usr/lib/jvm/java-8-openjdk-amd64/bin/javac重要提示请注意java和javac的路径差异java命令通常在jre/bin/目录下而javac命令在bin/目录下。使用--set前最好用update-alternatives --config java确认一下准确的路径。路径错误会导致命令失效。设置完成后再次运行java -version和javac -version确认输出已变为JDK 8的版本信息。3.4 配置 JAVA_HOME 环境变量很多Java应用和构建工具如Maven、Gradle、Tomcat、Spring Boot都依赖JAVA_HOME环境变量来定位Java安装目录。虽然设置了默认命令但配置JAVA_HOME仍是专业做法。首先找到JDK 8的安装根目录。通常apt安装的OpenJDK会在/usr/lib/jvm/目录下。你可以用以下命令列出所有已安装的Java版本ls -l /usr/lib/jvm/你应该能看到一个类似java-8-openjdk-amd64的目录架构可能是arm64等。这个目录的路径就是你的JAVA_HOME。接下来将JAVA_HOME设置为全局环境变量。编辑/etc/environment文件这个文件是系统级别的对所有用户生效sudo nano /etc/environment在文件末尾或在已有的PATH变量后添加一行JAVA_HOME/usr/lib/jvm/java-8-openjdk-amd64请务必将路径替换为你实际看到的路径。保存并退出编辑器。然后让这个更改立即对当前shell生效source /etc/environment验证是否设置成功echo $JAVA_HOME应该输出你设置的路径。实操心得为什么不推荐只在~/.bashrc或~/.profile中设置因为那些是用户级别的配置。如果你以其他用户身份比如sudo某些服务运行Java应用或者系统服务如systemd服务需要Java它们可能读取不到用户级别的变量。在/etc/environment中设置是影响范围最广、最彻底的方式。当然如果你只是个人开发机放在~/.bashrc里更方便但知道两者的区别很重要。4. 验证与深度管理完成上述步骤后我们需要进行全面的验证并了解一些高级管理技巧。4.1 全方位验证安装结果一个完整的验证应该包括以下几点验证默认版本java -version javac -version确保输出均为OpenJDK 8。验证JAVA_HOMEecho $JAVA_HOME输出应为JDK 8的安装根目录。验证JAVA_HOME指向的版本$JAVA_HOME/bin/java -version这个命令直接调用JAVA_HOME指定路径下的Java其版本应与第一步一致。这是最可靠的验证因为它绕过了update-alternatives的链接。验证关键工具链which java which javacwhich命令会告诉我们终端中执行的java和javac命令最终指向的二进制文件路径。它们应该分别指向/etc/alternatives/java和/etc/alternatives/javac而这两个链接现在应该指向JDK 8的路径。4.2 管理多个Java版本在实际开发中我们经常需要在不同项目间切换Java版本。update-alternatives已经为我们提供了基础支持。你可以随时运行sudo update-alternatives --config java进行切换。但对于更复杂的场景比如为单个Shell会话临时切换版本或者与IDE如IntelliJ IDEA的项目JDK设置配合仅仅切换系统默认可能不够。这时一些版本管理工具就派上用场了jenv一个轻量级的命令行工具可以方便地设置全局、目录项目或Shell会话级别的Java版本。SDKMAN!一个强大的工具不仅可以管理多个Java发行版OpenJDK、GraalVM、Zulu等还能管理Maven、Gradle、Spring Boot CLI等一大堆JVM生态工具。例如使用SDKMAN安装并切换Java版本# 安装SDKMAN curl -s https://get.sdkman.io | bash source $HOME/.sdkman/bin/sdkman-init.sh # 列出可安装的Java版本 sdk list java # 安装一个特定的JDK 8发行版如Liberica sdk install java 8.0.412-librca # 在当前Shell切换到这个版本 sdk use java 8.0.412-librca这些工具提供了比系统级update-alternatives更灵活、更细粒度的控制特别适合多项目并行的开发者。4.3 清理旧版本或错误安装如果你之前尝试过其他安装方式比如手动解压TAR包系统里可能会有残留。为了保持环境整洁可以清理掉不再需要的Java版本。首先列出所有apt安装的与Java相关的包apt list --installed | grep -i openjdk找到你想移除的包名例如如果你不再需要OpenJDK 11然后使用apt remove进行卸载。谨慎操作确保你不会卸载正在被其他关键软件依赖的包。sudo apt remove openjdk-11-jdk openjdk-11-jre openjdk-11-jre-headlessapt remove会移除软件包但保留配置文件。如果你想彻底清除包括配置文件可以使用sudo apt purge package-name。对于通过update-alternatives管理的链接即使删除了软件包其配置项有时还会残留。你可以用以下命令清理# 查看java命令的备选列表确认要删除的项 sudo update-alternatives --config java # 从alternatives系统中移除一个已不存在的路径假设路径是/path/to/old/java sudo update-alternatives --remove java /path/to/old/java5. 常见问题与排查技巧实录即使按照步骤操作你也可能会遇到一些“坑”。下面是我在实际操作和帮助他人时遇到的一些典型问题及解决方法。5.1 问题add-apt-repository命令未找到现象执行sudo add-apt-repository ppa:openjdk-r/ppa时提示add-apt-repository: command not found。原因在一些最小化安装的Linux系统如某些Docker镜像、云服务器镜像中software-properties-common这个包没有被预装而这个包提供了add-apt-repository命令。解决先安装这个工具包。sudo apt update sudo apt install software-properties-common5.2 问题PPA添加失败或apt update报错现象添加PPA后运行sudo apt update出现GPG error、The following signatures couldn‘t be verified或Failed to fetch等错误。原因网络问题导致GPG密钥下载失败或者PPA源地址当前不可用。解决检查网络连接。尝试移除并重新添加PPAsudo add-apt-repository --remove ppa:openjdk-r/ppa sudo apt update # 稍等片刻再尝试重新添加 sudo add-apt-repository ppa:openjdk-r/ppa sudo apt update手动下载密钥备用方案如果上述方法不行可以尝试搜索该PPA的官方说明看是否有手动添加密钥的方法但这种情况较少见。终极方案如果PPA不稳定考虑直接从OpenJDK官网或Adoptium等站点下载JDK 8的.tar.gz包进行手动安装。虽然失去了apt管理的便利但能保证获取到软件。5.3 问题设置默认Java后java -version生效但javac -version没变现象运行sudo update-alternatives --config java选择了JDK 8后java命令版本正确但javac命令显示的仍是旧版本。原因java和javac在update-alternatives中是两个独立的备选组。你只配置了java没有配置javac。解决同样使用--config或--set命令为javac进行设置。sudo update-alternatives --config javac # 或者 sudo update-alternatives --set javac /usr/lib/jvm/java-8-openjdk-amd64/bin/javac5.4 问题应用程序如IDE、Tomcat仍使用旧版本Java现象终端里java -version显示是JDK 8但IntelliJ IDEA里新建项目时检测到的还是JDK 11或者启动Tomcat时日志显示是其他版本。原因IDE独立配置像IntelliJ IDEA、Eclipse这类IDE有自己独立的JDK配置路径在File-Project Structure-SDKs里。你需要在这里手动添加或选择JDK 8的安装路径即JAVA_HOME。服务启动脚本指定一些通过systemd服务或init脚本启动的Java应用如Tomcat作为服务安装可能在启动脚本如setenv.sh或catalina.sh中硬编码了JAVA_HOME路径或者通过JAVA_OPTS环境变量指定。你需要修改这些脚本或者确保启动该服务的用户环境中的JAVA_HOME变量是正确的。Shell环境差异你可能在某个终端里source /etc/environment了但启动IDE的桌面环境或启动服务的系统环境并没有读取到这个变更。对于系统服务通常需要在服务单元文件.service文件中通过Environment指令来设置JAVA_HOME。排查思路对于IDE检查其内部的JDK配置。对于命令行应用在启动应用的同一个终端里先echo $JAVA_HOME和java -version确认环境。对于系统服务使用systemctl show service-name | grep Environment查看服务环境并编辑服务单元文件进行设置。5.5 问题安装后内存不足OutOfMemoryError现象运行Java应用时抛出java.lang.OutOfMemoryError: Java heap space等错误。原因JDK安装本身不会导致内存不足但运行Java应用时如果应用需要的内存超过JVM默认分配的堆内存对于JDK 8客户端模式默认可能只有几十MB到几百MB就会报错。解决这不是安装问题而是JVM参数配置问题。你需要根据应用需求调整启动参数主要是-Xmx最大堆内存和-Xms初始堆内存。在命令行启动时指定java -Xmx1024m -Xms256m -jar myapp.jar在IDE的运行配置中指定VM参数。在Tomcat等容器的启动脚本如catalina.sh中设置JAVA_OPTS环境变量export JAVA_OPTS-Xmx1024m -Xms256m踩坑记录曾经在一台内存只有1GB的旧服务器上部署应用默认设置下频繁OOM。后来通过分析应用实际使用情况将-Xmx设置为768m-Xms设置为256m并为Tomcat设置了-XX:MaxMetaspaceSize128m来限制元空间大小才稳定下来。监控和调优JVM内存是一个持续的过程jstat、jmap和可视化工具如VisualVM是你的好朋友。通过以上从原理到实操从安装到排坑的完整流程你应该能够游刃有余地在任何基于apt的Linux系统上搭建起一个稳固且易于管理的JDK 8开发环境。记住工具的价值在于让人更专注于创造而不是折腾环境。希望这篇详尽的记录能帮你把环境配置这件事彻底变成肌肉记忆。