如何在macOS上切换Java JDK:新手常犯的5个错误及解决方法

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

如何在macOS上轻松切换Java (JDK) 版本:给厌倦错误者的指南

\n\n

您是否曾尝试运行一个旧的Java项目,但它却不断报错?或者相反,新的IDE需要JDK 17,而您安装的却是JDK 8?如果您使用macOS,那么您很可能遇到过切换Java版本就像一场冒险的情况。似乎 java -version 命令有自己的想法,并不听从您的意愿。

\n\n

在Stack Overflow上,“How to set or change the default Java (JDK) version on macOS?”这个问题获得了数千次浏览和数百条评论。人们在路径上感到困惑,忘记了 JAVA_HOME,并意外地破坏了系统。让我们一劳永逸地弄清楚:如何在Mac上管理JDK,新手会遇到哪些错误,以及如何避免它们。

\n\n

这篇文章不是枯燥的文档。我们将从完全混乱的状态走向清晰的理解。开始吧!

\n\n

为什么macOS对Java的处理如此“奇怪”?

\n\n

首先需要理解的是:macOS是一个Unix系统,它不喜欢您手动将文件放到不该放的位置。Apple默认将JDK安装在 /Library/Java/JavaVirtualMachines/,而像 /usr/bin/java 这样的系统工具只是查看您 JAVA_HOME 的包装器。

\n\n

最常见的错误是尝试重命名或删除JDK文件夹。不要这样做!相反,您需要学会管理符号链接和环境变量。

\n\n

步骤1:查看您已安装的JDK

\n\n

在更改任何内容之前,让我们先看看您有哪些JDK。打开终端并执行:

\n\n
/usr/libexec/java_home -V
\n\n

您会看到类似这样的内容:

\n\n
Matching 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\n
export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home\njava -version  # 显示17
\n\n

然后感到高兴。但是一旦关闭终端并打开一个新的,一切都会恢复到旧版本。为什么?因为 export 只在当前会话中有效。

\n\n

解决方法: 将此行添加到您的shell配置文件中。如果您使用 zsh(macOS Catalina及更新版本的标准shell),请编辑 ~/.zshrc 文件:

\n\n
echo 'export JAVA_HOME=$(/usr/libexec/java_home -v 17)' >> ~/.zshrc\nsource ~/.zshrc
\n\n

如果您使用 bash(旧版macOS),则文件名为 ~/.bash_profile。

\n\n

错误2:混淆 java 和 javac

\n\n

您更改了 JAVA_HOME,java -version 命令显示了正确的版本,但 javac -version 却固执地显示旧版本。熟悉吗?

\n\n

这是因为 java 和 javac 是不同的可执行文件。有时它们可能来自不同的JDK。检查它们的位置:

\n\n
which java   # /usr/bin/java\nwhich javac  # /usr/bin/javac
\n\n

如果路径相同,问题在于 /usr/bin/java 是一个符号链接,可能指向旧版本。使用 java_home 工具更新它:

\n\

博客

书籍推荐