从 Mac 卸掉 Java,别弄断工具链
「在 Mac 上卸载 Java」里藏着两个问题,答错就会把工具链弄坏,第一个是机器上到底有哪一份 Java,第二个是还有哪些软件默认它在。
Oracle 自己的说明很短,最重要的一句不是步骤,而是一条警告:有一个目录不要动。
不要从 /usr/bin 里删 Java
Oracle 写得很直接,不要试图通过删除 /usr/bin 里的 Java 工具来卸载,该目录属于系统软件,下次 macOS 更新时 Apple 会把改动重置回去。
这是最常见的翻车方式,敲 which java 会返回 /usr/bin 下的路径,看起来像答案,其实不是,在 macOS 上这些只是指向实际已安装运行环境的占位入口,删掉它们等于拆路标而不是拆楼,macOS 之后还会把它们装回来。
先弄清要删的是哪一份 Java
运行环境和开发工具包是不同的安装,卸载方式也不同。
面向普通用户的 Oracle JRE(带浏览器插件和偏好设置面板的运行环境)在 Oracle 点名的三个位置:
/Library/Internet Plug-Ins/JavaAppletPlugin.plugin
/Library/PreferencePanes/JavaControlPanel.prefPane
~/Library/Application Support/Oracle/Java
JDK 是另一套,装在 /Library/Java/JavaVirtualMachines/ 下,删除需要管理员权限,可以并排装多个,这很常见,往往是有意为之。
动手前先列出实际装了什么:
/usr/libexec/java_home -V
它会打印系统已知的每一个 JDK,含版本和路径,列表只有一项时选择很简单,若有四项,下一节就很重要。
删错 JDK 会弄坏别的软件
Java 很少为了自己而装,Android 工具链、Elasticsearch、Minecraft 启动器、JetBrains 系列 IDE、Apache 工具,以及部分企业 VPN 和打印客户端,都会自带或依赖 Java 虚拟机,有些内嵌了自己的副本,不受影响,有些解析系统提供的那一份,环境一变就停工。
若 JDK 是用包管理器装的,就用同样方式卸,Homebrew 装的 temurin 用 brew uninstall 卸掉,手工抠文件会让包数据库仍认为它在。
用官方支持的方式删 JDK
若 JDK 是用 .pkg 装的,删除对象是 /Library/Java/JavaVirtualMachines/ 下带版本号的那一层目录,并需要 sudo,一次只删一个版本,确认常用工具仍正常,再删下一个。
之后 /usr/libexec/java_home -V 不应再列出它,若曾在 shell 配置里手写 JAVA_HOME,它现在会指向空处,这个环境变量是「明明卸干净了工具链却挂了」的第二常见原因。
关掉终端前先核对
/usr/libexec/java_home -V
java -version
第一条显示还剩什么,第二条要么报出版本,要么提示没有已安装的运行环境,在你本意就是清空的机器上,后一种才是正确结果,不是报错。
整块占用视图能帮上什么
Java 的残留又小又散又无聊:缓存、偏好设置、一个插件、一块偏好设置面板,值得花时间的是那份清单,而终端已经能给你,若更想一次看到某个 JDK 或自带 JDK 的应用整块占用、并标出体积,Mole 会列出来,不必事先知道路径。
删完之后要回头看的三处
第一处是 shell 配置,~/.zshrc 和 ~/.zprofile 里手写的 JAVA_HOME 不会随 JDK 一起消失,它会继续指向一个已经不存在的路径,之后每个新 shell 都带着这个坏变量,删掉那一行,或者改成 export JAVA_HOME=$(/usr/libexec/java_home),让它跟着系统走。
第二处是 IDE,JetBrains 系和 Android Studio 会在项目设置里记住具体的 JDK 路径,系统里换了版本它们不会自己跟着改,表现是项目突然编不过而命令行一切正常。
第三处是包管理器装的那些,brew list | grep -i -E 'jdk|temurin|zulu|openjdk' 能看出哪些是 Homebrew 装的,它们要用 brew uninstall 卸,手工删掉目录会让 Homebrew 的数据库继续以为它还在。