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

资讯详情

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

Ubuntu系统安装配置JDK全攻略:从OpenJDK选择到多版本管理

Ubuntu系统安装配置JDK全攻略:从OpenJDK选择到多版本管理 1. 项目概述为什么在Ubuntu上搞JDK是个技术活最近在帮几个刚入行的后端兄弟搭环境发现一个挺有意思的现象很多人觉得在Ubuntu里装个JDK不就是apt install一下的事儿吗但真上手了十有八九会卡在版本选择、环境变量配置或者多版本管理上最后整得java -version命令报错一脸懵。这事儿吧说简单也简单说复杂里头的门道还真不少。选不对版本你辛辛苦苦写的Spring Boot项目可能就跑不起来环境变量配错一个符号所有依赖Java的命令都会罢工。所以今天咱们就抛开那些泛泛而谈的教程深挖一下在Ubuntu系统上安装和配置JDK的完整流程、背后的原理以及我踩过坑之后总结出来的“保命”技巧。无论你是要在服务器上部署生产环境还是在本地开发机上搭建学习环境这篇都能给你一个清晰、可靠、可复现的操作指南。2. 核心思路与方案选型OpenJDK vs Oracle JDK动手之前咱们得先搞清楚要装什么。目前主流的JDK发行版就两大阵营OpenJDK和Oracle JDK。很多新手会纠结到底选哪个OpenJDK是开源的参考实现由社区和各大厂商如Red Hat, Amazon, Azul等共同维护。它的优势在于完全免费、开源并且通过系统包管理器如apt安装极其方便版本更新也跟得上。对于绝大多数开发和生产场景特别是使用Docker容器或云原生环境时OpenJDK是首选因为它没有额外的许可费用社区支持也活跃。Oracle JDK以前是Oracle公司的商业产品虽然现在也提供了免费版本但其许可协议OTN协议对于商业使用有一定限制需要仔细阅读条款。它的优势在于可能包含一些OpenJDK没有的、Oracle专有的商业特性比如某些高级监控工具并且在一些极端性能调优场景下可能仍有其价值。但请注意从Oracle官网直接下载安装包进行安装步骤会比OpenJDK繁琐。我的选择建议是对于个人学习、开发和绝大多数企业级应用直接选择OpenJDK。理由很简单第一免去了许可风险的担忧第二通过apt管理安装、升级、卸载都异常轻松第三生态兼容性极好像Spring Boot、Tomcat等主流框架对OpenJDK的支持都是第一优先级的。因此本篇实操将主要围绕OpenJDK展开这也是目前业内的绝对主流做法。确定了发行版接下来是版本选择。Java的长期支持版本是咱们需要重点关注的。目前Java 11和Java 17是LTS版本应用最广。Java 8虽然“老当益壮”但已结束公开免费更新。对于新项目我强烈建议直接从Java 17或Java 21开始它们带来了很多现代语言特性和性能提升。我们将以安装Java 17为例进行演示这个方法同样适用于其他版本。3. 实操准备与系统环境确认在开始敲命令之前做好准备工作能让整个过程顺畅很多。首先确保你拥有一个正在运行的Ubuntu系统。我演示的环境是Ubuntu 22.04 LTS这个版本目前用户基数大也足够稳定。其他如20.04、24.04等版本操作大同小异。打开你的终端。第一件事更新一下系统的软件包列表。这个操作就像去超市购物前先看看最新的商品目录确保我们能获取到最新的软件源信息。sudo apt update接下来检查一下当前系统是否已经安装了Java。有时候系统会预装一个旧版本的OpenJDK或者你自己之前装过。java -version如果这条命令返回了“Command ‘java’ not found”或者显示了一个非常旧的版本比如Java 8那么我们就可以放心地继续安装了。如果已经有一个版本但你想要安装新的并设置为默认也没问题我们后面会处理多版本共存。注意在生产服务器上操作前建议先在测试环境演练一遍。如果是在已有Java应用的服务器上升级务必做好备份和回滚预案。4. 核心安装流程详解APT安装与手动安装安装OpenJDK最推荐的方式就是使用Ubuntu自带的APT包管理器。它帮你处理了下载、安装、依赖关系和初始配置是最“Ubuntu”的方式。4.1 使用APT安装OpenJDK 17首先搜索一下软件源里有哪些可用的JDK包。OpenJDK的包名通常是openjdk-版本号-jdk其中-jdk表示包含完整的开发工具包编译器、调试器等如果只需要运行环境可以安装-jre但为了开发我们一律安装-jdk。apt search openjdk-17-jdk你会看到类似openjdk-17-jdk的包。确认后直接安装sudo apt install openjdk-17-jdk -y这里的-y参数表示自动确认安装省去手动输入“yes”的步骤。安装过程会自动拉取所有必要的依赖包。安装完成后立刻验证一下java -version如果安装成功你会看到类似下面的输出其中明确显示了“OpenJDK”和版本号“17.0.x”openjdk version 17.0.10 2024-01-16 OpenJDK Runtime Environment (build 17.0.107-Ubuntu-1ubuntu122.04) OpenJDK 64-Bit Server VM (build 17.0.107-Ubuntu-1ubuntu122.04, mixed mode, sharing)同时也可以检查一下编译器javac是否可用javac -version至此通过APT安装就已经完成了。是不是很简单但这种方式安装的Java其安装路径是由APT管理的通常位于/usr/lib/jvm/目录下。你可以用以下命令查看ls /usr/lib/jvm/你会看到一个以java-17-openjdk-amd64命名的符号链接或文件夹。4.2 手动安装与配置适用于特定需求虽然APT很方便但有些时候你可能需要更灵活的控制比如安装APT源里没有的特定小版本或者安装Oracle JDK。这时就需要手动下载、解压、配置。第一步下载JDK压缩包。前往 Adoptium 推荐提供高质量的OpenJDK预构建包或Oracle官网下载对应版本的.tar.gz压缩包。例如在终端里使用wget下载wget https://github.com/adoptium/temurin17-binaries/releases/download/jdk-17.0.10%2B7/OpenJDK17U-jdk_x64_linux_hotspot_17.0.10_7.tar.gz第二步解压到指定目录。通常我们会把手动安装的软件放在/usr/local/lib或/opt目录下这里以/opt为例sudo tar -xzf OpenJDK17U-jdk_x64_linux_hotspot_17.0.10_7.tar.gz -C /opt/解压后/opt目录下会多出一个类似jdk-17.0.107的文件夹。第三步配置环境变量关键步骤。这是手动安装的核心也是容易出错的地方。我们需要告诉系统Java命令的位置。环境变量通常配置在用户级别的~/.bashrc文件针对bash shell或~/.profile文件。nano ~/.bashrc在文件末尾添加以下几行export JAVA_HOME/opt/jdk-17.0.107 export PATH$JAVA_HOME/bin:$PATHJAVA_HOME指向你的JDK安装根目录。很多Java应用如Maven、Gradle、Tomcat都依赖这个变量来找到Java。PATH将JDK的bin目录添加到系统路径的最前面。这样当你在终端输入java或javac时系统会优先在这个目录下查找。保存文件后让配置立即生效source ~/.bashrc现在再次验证java -version echo $JAVA_HOME应该能正确显示你手动安装的JDK版本和路径。实操心得手动安装时JAVA_HOME的路径一定要精确到解压后的文件夹本身而不是其父目录。一个快速检查的方法是确保$JAVA_HOME/bin/java这个文件存在。5. 多版本管理与默认版本切换开发中经常遇到不同项目需要不同Java版本的情况。Ubuntu提供了一个非常棒的工具update-alternatives。它可以管理系统中共存的多个软件版本并让你轻松切换默认版本。即使你只通过APT安装了一个JDK系统也可能预装了其他Java相关包如java-common。我们可以用update-alternatives来统一管理。首先为你安装的每个Java版本在alternatives系统中注册命令。对于通过APT安装的OpenJDK 17通常已经自动注册了。但为了演示我们手动注册一下如果是手动安装的JDK这一步是必须的sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/java-17-openjdk-amd64/bin/java 1 sudo update-alternatives --install /usr/bin/javac javac /usr/lib/jvm/java-17-openjdk-amd64/bin/javac 1命令参数解释--install注册一个备选方案。/usr/bin/java通用命令路径链接。java备选组的名称。/usr/lib/jvm/.../bin/java该备选方案的实际命令路径。1优先级数字越大优先级越高。然后查看和管理可用的Java版本sudo update-alternatives --config java执行后终端会列出所有已注册的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-17-openjdk-amd64/bin/java 1 manual mode Press enter to keep the current choice[*], or type selection number:输入对应java-17-openjdk-amd64的编号比如2然后回车就将默认Java切换到了17版本。对javac命令也执行同样的--config操作。验证切换结果java -version现在输出的应该就是你刚选择的版本了。这个方法的妙处在于它是系统全局的切换对所有用户和终端会话都生效而且切换过程干净利落。6. 环境变量深度解析JAVA_HOME与PATH的奥秘前面我们提到了JAVA_HOME和PATH这里再深入讲一下它们的区别和最佳实践这是很多配置问题的根源。PATH环境变量它的值是一串用冒号分隔的目录路径。当你在终端输入一个命令如java时系统会按照PATH中目录的先后顺序依次在这些目录里查找可执行文件找到第一个匹配的就执行。这就是为什么我们要把$JAVA_HOME/bin放在PATH的前面$JAVA_HOME/bin:$PATH以确保系统使用的是我们指定的JDK而不是其他可能存在的旧版本。JAVA_HOME环境变量它本身不直接用于命令查找。它是一个指向JDK安装根目录的指针。许多Java生态工具比如构建工具Maven、Gradle在编译项目时会读取JAVA_HOME来定位编译器。应用服务器Tomcat、Jetty在启动时需要JAVA_HOME来找到JVM。IDEIntelliJ IDEA、Eclipse在配置SDK时本质上就是在设置JAVA_HOME。配置的最佳位置系统级配置影响所有用户编辑/etc/environment文件只用于设置变量不推荐用于PATH或创建/etc/profile.d/目录下的脚本如java.sh。这对于服务器统一环境非常有用。用户级配置仅影响当前用户编辑~/.bashrc针对bash或~/.zshrc针对zsh。这是开发机上的常见做法。会话级配置仅当前终端有效直接在终端中export关闭终端即失效。我个人的习惯是在个人开发机上将JAVA_HOME和PATH的配置放在~/.bashrc或~/.zshrc末尾。这样既不影响系统其他用户又能永久生效。记得每次修改后要source一下配置文件。7. 验证安装与编写测试程序安装和配置完成后不能只满足于java -version。我们需要确保JDK能真正工作。最直接的验证方式就是写一个简单的“Hello World”程序并编译运行。创建一个工作目录并进入mkdir ~/java-test cd ~/java-test使用文本编辑器如nano或vim创建一个Java文件nano HelloWorld.java输入以下经典代码public class HelloWorld { public static void main(String[] args) { System.out.println(Hello, Ubuntu JDK!); } }保存并退出编辑器。现在使用javac编译器编译它javac HelloWorld.java如果编译成功不会有任何输出但当前目录会生成一个HelloWorld.class的字节码文件。最后运行这个程序java HelloWorld如果终端漂亮地打印出了“Hello, Ubuntu JDK!”那么恭喜你你的JDK安装、环境变量配置、编译和运行环境全部就绪可以投入开发了。注意事项java命令后面跟的是类名HelloWorld而不是文件名HelloWorld.class。这是一个新手常犯的错误。JVM会根据类名在classpath默认为当前目录中寻找对应的.class文件来加载执行。8. 常见问题排查与解决方案实录即便按照步骤操作也可能会遇到一些“坑”。下面是我总结的几个典型问题及其解决方法。问题一执行java -version提示“Command ‘java’ not found”原因PATH环境变量中没有包含Java的bin目录或者安装没有成功。排查检查JDK是否真的安装了dpkg -l | grep openjdk或检查手动安装的目录是否存在。检查PATH变量echo $PATH看输出中是否包含类似/usr/lib/jvm/java-17-openjdk-amd64/bin的路径。检查环境变量配置文件如~/.bashrc是否已正确配置并生效执行了source。解决如果未安装回头执行安装步骤。如果PATH不对修正配置文件并source。对于APT安装有时需要手动建立符号链接极少见sudo ln -s /usr/lib/jvm/java-17-openjdk-amd64/bin/java /usr/bin/java问题二版本切换update-alternatives --config java后java -version显示的版本没变原因很可能是因为PATH环境变量中某个路径比如手动添加的$JAVA_HOME/bin的优先级高于update-alternatives管理的/usr/bin/java链接。排查执行which java查看最终指向的是哪个路径。如果指向的是/home/yourname/.sdkman/candidates/java/current/bin/java或你手动配置的某个具体路径而不是/usr/bin/java那就说明PATH覆盖了系统的默认链接。解决调整PATH变量的顺序确保系统目录如/usr/bin的优先级高于自定义路径或者直接使用update-alternatives设置的环境。更干净的做法是在~/.bashrc中注释掉或删除手动添加的JAVA_HOME/bin到PATH的语句完全依赖update-alternatives来管理版本。问题三IDE如IntelliJ IDEA检测不到新安装的JDK原因IDE有自己独立的SDK配置缓存或者JAVA_HOME环境变量没有正确设置。排查与解决在终端确认echo $JAVA_HOME输出正确的路径。打开IDE如IDEA进入File-Project Structure-SDKs点击“”号选择“Add JDK”然后手动导航到你的JDK安装目录例如/usr/lib/jvm/java-17-openjdk-amd64。IDE通常不需要依赖系统的JAVA_HOME手动指定一次即可。重启IDE使其重新读取系统环境。问题四编译或运行时出现“UnsupportedClassVersionError”原因这是版本不匹配的经典错误。你用更高版本的JDK编译了.class文件比如用Java 17编译但试图用更低版本的JRE/JDK去运行它比如用Java 11运行。解决统一环境。确保编译环境javac版本和运行环境java版本一致。使用java -version和javac -version检查并通过update-alternatives将它们切换到同一个版本。问题五手动安装后JAVA_HOME变量在终端有效但在某些脚本或GUI程序中无效原因~/.bashrc文件只在交互式bash shell登录时被读取。对于非交互式shell如由cron任务、某些服务管理器或GUI程序启动的shell是不读取.bashrc的。解决对于需要全局生效的场景将JAVA_HOME和PATH的设置放到/etc/environment系统级对所有进程生效或用户级的~/.profile文件中该文件在图形登录时也会被读取。修改/etc/environment后需要重启系统或重新登录才能生效。
返回列表