如何在macOS上轻松切换Java (JDK) 版本:给厌倦错误者的指南
\n\n您是否曾尝试运行一个旧的Java项目,但它却不断报错?或者相反,新的IDE需要JDK 17,而您安装的却是JDK 8?如果您使用macOS,那么您很可能遇到过切换Java版本就像一场冒险的情况。似乎 java -version 命令有自己的想法,并不听从您的意愿。
在Stack Overflow上,“How to set or change the default Java (JDK) version on macOS?”这个问题获得了数千次浏览和数百条评论。人们在路径上感到困惑,忘记了 JAVA_HOME,并意外地破坏了系统。让我们一劳永逸地弄清楚:如何在Mac上管理JDK,新手会遇到哪些错误,以及如何避免它们。
这篇文章不是枯燥的文档。我们将从完全混乱的状态走向清晰的理解。开始吧!
\n\n为什么macOS对Java的处理如此“奇怪”?
\n\n首先需要理解的是:macOS是一个Unix系统,它不喜欢您手动将文件放到不该放的位置。Apple默认将JDK安装在 /Library/Java/JavaVirtualMachines/,而像 /usr/bin/java 这样的系统工具只是查看您 JAVA_HOME 的包装器。
最常见的错误是尝试重命名或删除JDK文件夹。不要这样做!相反,您需要学会管理符号链接和环境变量。
\n\n步骤1:查看您已安装的JDK
\n\n在更改任何内容之前,让我们先看看您有哪些JDK。打开终端并执行:
\n\n/usr/libexec/java_home -V\n\n您会看到类似这样的内容:
\n\nMatching Java Virtual Machines (3):\n 17.0.6 (x86_64) "Oracle Corporation" - "Java SE 17.0.6" /Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home\n 11.0.18 (x86_64) "Oracle Corporation" - "Java SE 11.0.18" /Library/Java/JavaVirtualMachines/jdk-11.jdk/Contents/Home\n 1.8.0_361 (x86_64) "Oracle Corporation" - "Java SE 8" /Library/Java/JavaVirtualMachines/jdk1.8.0_361.jdk/Contents/Home\n\n这是系统知道的所有JDK的完整列表。如果您通过Homebrew或手动安装了JDK,但它没有显示出来,这意味着它放在了错误的文件夹中,或者没有正确的结构。
\n\n错误1:认为 export JAVA_HOME 是永久性的
\n\n新手经常在终端中输入:
\n\nexport JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home\njava -version # 显示17\n\n然后感到高兴。但是一旦关闭终端并打开一个新的,一切都会恢复到旧版本。为什么?因为 export 只在当前会话中有效。
解决方法: 将此行添加到您的shell配置文件中。如果您使用 zsh(macOS Catalina及更新版本的标准shell),请编辑 ~/.zshrc 文件:
echo 'export JAVA_HOME=$(/usr/libexec/java_home -v 17)' >> ~/.zshrc\nsource ~/.zshrc\n\n如果您使用 bash(旧版macOS),则文件名为 ~/.bash_profile。
错误2:混淆 java 和 javac
\n\n您更改了 JAVA_HOME,java -version 命令显示了正确的版本,但 javac -version 却固执地显示旧版本。熟悉吗?
这是因为 java 和 javac 是不同的可执行文件。有时它们可能来自不同的JDK。检查它们的位置:
which java # /usr/bin/java\nwhich javac # /usr/bin/javac\n\n如果路径相同,问题在于 /usr/bin/java 是一个符号链接,可能指向旧版本。使用 java_home 工具更新它: