尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

Ubuntu 20.04安装配置JDK全攻略:APT、手动安装与多版本管理

Ubuntu 20.04安装配置JDK全攻略:APT、手动安装与多版本管理 1. 项目概述为什么要在Ubuntu上折腾JDK如果你刚接触Linux开发或者从Windows/macOS转战到Ubuntu服务器环境安装Java开发工具包JDK很可能是你遇到的第一个“下马威”。这看似是一个简单的软件安装任务但背后却牵扯到版本选择、环境变量配置、多版本管理等一系列决定后续开发体验的关键决策。我见过不少新手照着网上零散的教程装完java -version命令也能跑但一到运行自己写的Spring Boot项目或者使用Maven构建时就冒出各种ClassNotFoundException或版本不兼容的诡异错误折腾半天才发现是JDK安装没做到位。Ubuntu 20.04 LTS作为一个长期支持版本在服务器和开发环境中保有很高的占有率。在这个系统上正确安装和配置JDK是搭建Java开发、运行环境的基石。它不仅仅是运行一个安装命令那么简单更关乎如何建立一个清晰、可维护、可扩展的基础环境。今天我就以从业十多年的经验带你从零开始在Ubuntu 20.04上彻底搞定JDK。我会详细拆解OpenJDK与Oracle JDK的选择困境演示通过APT仓库、手动下载包以及使用jenv工具管理多版本这三种最主流的安装方式并深入讲解环境变量设置的原理与陷阱。最后我会分享几个只有踩过坑才知道的验证技巧和常见问题排查实录确保你装上的JDK是真正“能用”且“好用”的。2. 核心思路解析APT、手动包还是版本管理工具在动手之前我们必须先理清思路在Ubuntu上安装JDK主要有哪几条路径每条路径的优缺点和适用场景是什么盲目选择最容易找到的教程往往会为日后埋下隐患。2.1 安装路径的三大选择与背后的考量2.1.1 使用APT包管理器安装推荐给大多数用户这是最便捷、最“Ubuntu”的方式。Ubuntu的官方仓库或一些第三方PPAPersonal Package Archive仓库中提供了打包好的JDK。你只需要运行sudo apt update和sudo apt install openjdk-11-jdk这样的命令即可。优点安装极其简单自动解决依赖关系后续可以通过apt统一管理和更新符合系统包管理规范。缺点仓库中的版本可能不是最新的小版本例如可能只有OpenJDK 11.0.15而没有11.0.16。对于必须使用特定小版本如某个Bug修复版或Oracle JDK的场景可能无法满足。核心考量你是否追求极致的安装便利性和系统一致性你的项目是否对JDK的微小版本号不敏感如果答案是肯定的APT是首选。2.1.2 手动下载归档包安装追求版本控制与灵活性直接从OpenJDK官网或Oracle官网下载.tar.gz或.deb归档文件手动解压或安装并自行配置环境变量。优点可以自由选择任何可用版本包括最新的早期访问EA版本。安装位置完全由自己控制例如/opt/java干净清晰不会干扰系统自带的包。在多版本共存时切换起来概念更清晰。缺点步骤繁琐需要手动处理环境变量。后续升级也需要手动下载和替换无法通过包管理器自动更新。核心考量你是否需要同时安装多个主要版本如8、11、17并灵活切换你是否需要精确控制JDK的安装位置和版本号如果是手动安装是必须掌握的技能。2.1.3 使用版本管理工具专业开发者的高效选择对于需要频繁在不同Java版本间切换的开发者可以使用像jenv、sdkman这样的工具。它们本身不安装JDK而是作为“管理器”帮你轻松下载、安装、切换多个JDK版本。优点版本切换命令极其简单如jenv global 11.0是管理多Java项目环境的利器。sdkman还能管理Maven、Gradle等其他JVM生态工具。缺点引入了额外的工具和学习成本。对于只需要一个固定JDK的服务器环境有点“杀鸡用牛刀”。核心考量你的本地开发机是否需要为不同的项目使用不同的Java版本你是否愿意为了高效管理而接受一个新工具对于本次指南我将重点详解前两种最基础也最必要的方法并在最后简要介绍jenv让你能根据自身情况做出最佳选择。2.2 OpenJDK vs Oracle JDK不再纠结的选择自从Oracle调整了JDK的授权协议OTN协议后对于生产环境社区普遍转向使用OpenJDK。这里简单厘清OpenJDKJava SE平台的开源参考实现。由Oracle、Red Hat、Azul等公司共同维护。现在各大Linux发行版仓库中的、以及从jdk.java.net下载的基本都是OpenJDK构建。对于绝大多数开发和生产场景它完全足够且没有授权风险。Oracle JDKOracle公司基于OpenJDK源码构建的商业发行版。在较新版本中它与OpenJDK在功能上几乎一致但授权协议不同特别是用于商业生产环境时。个人学习、开发通常免费但需仔细阅读其当前的使用条款。我的建议除非你有非常明确的、必须使用Oracle JDK的遗留商业理由例如某些旧版商业软件认证否则在Ubuntu 20.04上一律选择OpenJDK。它免费、开源、功能等同且社区支持更好。下文的所有操作都将以OpenJDK为例。3. 实操详解一通过APT包管理器安装OpenJDK这是最快捷的入门方式。我们将通过Ubuntu官方仓库安装OpenJDK 11一个广泛使用的LTS版本。3.1 更新软件包索引与搜索可用版本首先打开终端。在安装任何软件前更新本地软件包索引是一个好习惯它能确保你获取到仓库中最新的版本信息。sudo apt update更新完成后我们可以搜索一下仓库中可用的OpenJDK相关包apt search openjdk | grep -E ^openjdk-(8|11|17)-jdk这条命令会列出包含openjdk-8、11、17的JDK包。你会看到类似openjdk-11-jdk、openjdk-11-jre-headless等结果。其中-jdk包包含了完整的开发工具编译器、调试器等而-jre只包含运行环境。作为开发者我们当然安装-jdk。3.2 执行安装并验证基础功能假设我们决定安装OpenJDK 11运行以下命令sudo apt install openjdk-11-jdk安装过程会提示你确认磁盘空间占用输入y并回车。APT会自动处理所有依赖包括Java运行时环境JRE等。安装完成后立即进行基础验证java -version如果安装成功你会看到类似下面的输出其中明确显示了“OpenJDK”openjdk version 11.0.22 2024-01-16 OpenJDK Runtime Environment (build 11.0.227-post-Ubuntu-0ubuntu120.04.1) OpenJDK 64-Bit Server VM (build 11.0.227-post-Ubuntu-0ubuntu120.04.1, mixed mode, sharing)同样检查一下编译器javacjavac -version输出应为javac 11.0.22。实操心得仅仅java -version成功并不代表万事大吉。一定要同时验证javac。有些教程只安装-jre包导致只能运行Java程序而不能编译当你后续使用Maven或IDE时就会报错。3.3 理解APT安装的路径与环境变量通过APT安装后系统已经自动为我们配置好了关键的环境变量。理解这一点非常重要。JDK被安装到哪里了OpenJDK被分散安装到系统的标准目录中。你可以通过update-alternatives工具来查看当前系统默认的Java命令链接到了哪里update-alternatives --config java如果没有其他Java版本它通常会直接显示当前唯一的选择及其路径。典型的APT安装路径是/usr/lib/jvm/java-11-openjdk-amd64/。这个路径下包含了bin命令、lib库等子目录。环境变量是如何生效的APT安装的JDK其可执行文件如javajavac会被符号链接到/usr/bin目录下。而/usr/bin目录默认就在所有用户的PATH环境变量中。这就是为什么安装后你可以在任何位置直接运行java命令的原因系统通过PATH找到了位于/usr/bin/java的链接最终指向了实际的JDK二进制文件。这种方式非常“系统化”省去了手动配置JAVA_HOME和PATH的麻烦。但对于某些高级应用比如在~/.profile或脚本中明确引用JAVA_HOME我们可能仍需设置它。3.4 如何设置JAVA_HOME环境变量许多Java应用如Tomcat、Gradle、某些IDE插件以及我们自己的脚本会依赖JAVA_HOME环境变量来定位JDK的根目录。首先找到你的JDK安装的确切路径。使用dirname命令可以优雅地获取dirname $(readlink -f $(which java))执行后可能会返回类似/usr/lib/jvm/java-11-openjdk-amd64/bin的路径。我们需要的是其上级目录即/usr/lib/jvm/java-11-openjdk-amd64。这就是你的JAVA_HOME。接下来将这个变量设置到当前用户的配置文件中使其永久生效。推荐编辑~/.bashrc文件如果你使用默认的Bash shellnano ~/.bashrc在文件末尾添加以下行请确保路径与你查到的完全一致export JAVA_HOME/usr/lib/jvm/java-11-openjdk-amd64 export PATH$JAVA_HOME/bin:$PATH第二行将$JAVA_HOME/bin添加到了PATH变量的最前面确保系统优先使用我们设置的JDK命令。保存并退出编辑器在nano中按CtrlX然后按Y确认再回车。让配置立即生效source ~/.bashrc现在验证JAVA_HOMEecho $JAVA_HOME应该正确显示你设置的路径。注意事项~/.bashrc只针对交互式非登录shell生效比如新打开的终端窗口。对于通过SSH登录的情况或某些脚本执行环境它们可能读取的是~/.profile或~/.bash_profile。为了确保最大兼容性特别是服务器环境我通常会将相同的配置也添加到~/.profile文件中。你可以用同样的命令编辑~/.profile并source它。4. 实操详解二手动下载并安装OpenJDK当APT仓库的版本无法满足需求或者你需要更纯净、可控的安装时手动安装是必备技能。这里我们以从jdk.java.net下载OpenJDK 17的.tar.gz包为例。4.1 下载与准备安装目录首先访问 https://jdk.java.net/ 选择你需要的版本。例如找到“Java 17”的“Linux/x64”构建复制其.tar.gz下载链接。在终端中使用wget下载请替换为实际的下载链接cd ~/Downloads # 或任何你习惯的下载目录 wget https://download.java.net/java/GA/jdk17.0.10/.../openjdk-17.0.10_linux-x64_bin.tar.gz下载完成后我们计划将JDK安装到/opt/java目录。/opt目录常用于存放第三方应用程序的静态文件。sudo mkdir -p /opt/java然后将下载的归档包解压到该目录sudo tar -xzf openjdk-17.0.10_linux-x64_bin.tar.gz -C /opt/java/解压后/opt/java目录下会有一个类似jdk-17.0.10的文件夹。为了方便管理和未来可能的多版本共存我们可以创建一个通用符号链接cd /opt/java sudo ln -s jdk-17.0.10 current这样/opt/java/current就始终指向我们当前激活的JDK版本。未来升级时只需解压新版本然后更改current链接的目标即可无需改动环境变量。4.2 配置全局环境变量手动安装的关键一步就是正确配置环境变量。我们将修改全局配置文件使所有用户都能使用这个JDK。编辑全局profile文件sudo nano /etc/profile.d/java.sh在新建的文件中输入以下内容# Set JAVA_HOME to our manually installed JDK export JAVA_HOME/opt/java/current # Add JAVA_HOME/bin to the global PATH export PATH$JAVA_HOME/bin:$PATH保存并退出。这个脚本会在系统启动时为所有用户设置环境变量。为了让当前会话立即生效可以执行source /etc/profile.d/java.sh现在打开一个新的终端窗口验证echo $JAVA_HOME java -version javac -versionjava -version应该显示OpenJDK 17的信息并且JAVA_HOME指向/opt/java/current。4.3 处理系统默认Java命令的冲突如果你的系统之前通过APT安装过其他版本的OpenJDK那么/usr/bin/java可能指向了旧版本。虽然我们通过PATH将$JAVA_HOME/bin放在前面覆盖了默认命令但一些依赖于update-alternatives系统工具来切换Java版本的脚本或工具可能不会识别我们的手动设置。为了让系统更一致地识别我们的手动安装可以将其注册到update-alternatives中sudo update-alternatives --install /usr/bin/java java /opt/java/current/bin/java 1000 sudo update-alternatives --install /usr/bin/javac javac /opt/java/current/bin/javac 1000 # 可以继续为其他命令注册如 jar, javadoc 等这里的1000是优先级数字越大优先级越高。注册后你可以运行sudo update-alternatives --config java来查看和选择系统默认的Java版本。踩坑记录曾经有一次我在一台服务器上手动安装了JDK并设置了JAVA_HOME但一个通过systemd启动的Java服务总是报版本错误。排查了很久才发现该服务的启动脚本里直接调用了/usr/bin/java而update-alternatives的优先级设置有问题导致它指向了旧的版本。教训是在同时存在APT安装和手动安装的混合环境中使用update-alternatives进行统一管理能避免很多潜在的路径冲突问题。5. 多版本JDK管理与jenv工具简介在实际开发中同时维护多个Java项目是常态这些项目可能要求不同的JDK版本比如老项目用Java 8新项目用Java 17。频繁手动修改JAVA_HOME和PATH既麻烦又容易出错。这时像jenv这样的版本管理工具就派上用场了。5.1 jenv的核心工作原理jenv本身并不安装JDK。它只是一个轻量级的命令行工具其核心功能是管理已知的JDK路径你通过jenv add命令告诉它你手动安装或通过其他方式安装的各个JDK的位置。设置环境变量在shell层面jenv通过“垫片”shims和JENV_ROOT环境变量动态地根据你设定的规则全局、本地目录或当前shell将java、javac等命令指向对应的JDK版本。5.2 快速安装与使用jenv在Ubuntu上可以通过Git克隆来安装jenvgit clone https://github.com/jenv/jenv.git ~/.jenv然后将其集成到你的shell中以Bash为例echo export PATH$HOME/.jenv/bin:$PATH ~/.bashrc echo eval $(jenv init -) ~/.bashrc source ~/.bashrc假设你已经按照方法二在/opt/java下安装了JDK 11路径为/opt/java/jdk-11和JDK 17路径为/opt/java/current指向17。现在将它们添加到jenvjenv add /opt/java/jdk-11 jenv add /opt/java/current添加后使用jenv versions查看所有被管理的版本前面带*的是当前激活的版本。设置全局默认版本jenv global 17.0或者为某个特定项目目录设置本地版本在该目录下执行jenv local 11.0这会在当前目录下生成一个.java-version文件记录版本信息。设置完成后在任何终端中java -version就会自动切换为你为当前上下文全局或本地目录设定的版本。这极大地简化了多版本开发环境的管理。个人体会对于个人开发机jenv或sdkman几乎是必需品。它们把JDK版本管理从一项系统管理任务变成了一个简单的开发者工作流。我强烈建议任何需要接触多个Java项目的开发者花一点时间学习并使用它们。6. 安装后的关键验证与深度排查安装并配置好JDK后不要以为看到java -version就结束了。以下几个验证步骤能帮你确认JDK环境是真正健康、可用的。6.1 编写并运行一个简单的Java程序这是最直接的集成测试。创建一个测试文件nano ~/Test.java输入以下经典内容public class Test { public static void main(String[] args) { System.out.println(Java环境测试成功); System.out.println(JAVA_HOME: System.getProperty(java.home)); } }保存后依次执行编译和运行cd ~ javac Test.java java Test如果输出“Java环境测试成功”以及正确的java.home属性它应该与你设置的JAVA_HOME一致那么恭喜你编译和运行环境都完全正常。6.2 验证关键环境变量与属性除了JAVA_HOME还有一些运行时属性值得关注java -XshowSettings:properties -version 21 | grep -E java.home|java.version|java.vendor这条命令可以输出更详细的JDK属性确保其来源正确。6.3 排查“命令未找到”与版本混乱问题问题1输入java或javac提示“command not found”。原因PATH环境变量中没有包含JDK的bin目录。排查echo $PATH检查输出中是否包含你的JDK的bin目录路径如/opt/java/current/bin或/usr/lib/jvm/java-11-openjdk-amd64/bin。如果不包含请回顾第3.4或4.2节检查环境变量配置文件是否编辑正确是否执行了source命令。检查/usr/bin下是否有java的符号链接ls -l /usr/bin/java。如果是通过APT安装的这里应该有一个链接。问题2java -version显示的版本与echo $JAVA_HOME指示的版本不符。原因PATH中可能存在多个Java路径且顺序不对。或者update-alternatives的配置与JAVA_HOME冲突。排查使用which java命令查看当前shell实际调用的java命令的完整路径。对比该路径与$JAVA_HOME/bin/java是否一致。如果不一致检查你的PATH变量设置确保$JAVA_HOME/bin在靠前的位置例如在~/.bashrc中export PATH$JAVA_HOME/bin:$PATH是把新路径加在最前面。运行update-alternatives --config java查看系统级别的默认Java设置必要时进行调整。6.4 针对服务器与容器环境的特别检查在Docker容器或无图形界面的服务器上通常我们只需要JRE运行环境而不是完整的JDK。这时可以安装-jre-headless包它去除了图形和声音相关的依赖更轻量。sudo apt install openjdk-11-jre-headless如何判断当前安装的是JDK还是JRE一个简单的方法是检查javac命令是否存在。如果存在基本是JDK如果只有java命令则可能是JRE。对于自动化部署脚本如Ansible、Shell脚本在安装JDK后务必显式地source环境变量文件或者直接在脚本中导出JAVA_HOME和PATH因为脚本执行的环境可能不会自动加载用户profile。在Ubuntu 20.04上搭建一个健壮的Java开发环境远不止于一次性的安装命令。理解不同安装方式的优劣掌握环境变量的配置原理学会验证环境完整性并了解多版本管理工具这些共同构成了这项基础技能的完整图谱。无论是用于本地开发、持续集成流水线还是生产服务器一个正确配置的JDK基础环境都是后续所有Java应用稳定运行的起点。希望这份结合了多年实操和踩坑经验的指南能帮你一次搞定少走弯路。
返回列表