Mac 上解除安裝 Java,別弄壞工具鏈
「在 Mac 上解除安裝 Java」裡藏著兩個問題,答錯了,工具鏈就會壞掉。第一個是你裝了哪一種 Java。第二個是機器上還有什麼指望它在。
Oracle 自己的說明很短,其中最重要的那一行不是步驟,而是警告:有個目錄別去動。
不要從 /usr/bin 移除 Java
Oracle 直接寫明:不要試圖用刪除 /usr/bin 裡的 Java 工具來解除安裝 Java。那個目錄屬於系統軟體的一部分,任何更動都會在下次 macOS 更新時被 Apple 還原。
這是最常見的搞砸方式。輸入 which java 會回傳 /usr/bin 底下的路徑,看起來像答案,其實不是。在 macOS 上那些是指向實際已安裝 runtime 的 stub。刪掉它們只是拿掉路標,不是拆掉建築,而且 macOS 之後還會再放回去。
先搞清楚要移除的是哪一種 Java
Runtime 與開發套件是不同的安裝,移除方式也不同。
Oracle JRE(帶瀏覽器外掛與偏好設定面板的消費者 runtime)存在 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 與列印用戶端,都內附或依賴 JVM。有些自帶一份,不受影響。有些解析系統提供的版本,一變就停工。
若 JDK 是用套件管理器裝的,就用同一個方式移除。Homebrew 安裝的 temurin 用 brew uninstall 拿掉;手動抽走檔案會讓套件資料庫仍以為它還在。
用支援的方式移除 JDK
對從 .pkg 安裝的 JDK,移除對象是 /Library/Java/JavaVirtualMachines/ 底下名稱帶版本號的那個目錄,而且需要 sudo。一次移除一個版本,確認對你重要的工具都還正常,再動下一個。
完成後,/usr/libexec/java_home -V 不應再列出它,而你在 shell profile 裡手動設的任何 JAVA_HOME 現在會指到空處。那個變數是「清乾淨後工具鏈卻失敗」的第二常見原因。
關掉終端機之前先檢查
/usr/libexec/java_home -V
java -version
第一條顯示還剩什麼。第二條要嘛回報版本,要嘛告訴你沒有已安裝的 runtime;在你本來就要清乾淨的機器上,那是正確答案,不是錯誤。
佔用空間總覽在哪裡有用
Java 的殘留又小、又散、又無聊:快取、偏好設定、一個外掛、一個偏好設定面板。真正有意思的是盤點,而終端機已經給你了。若你想一次看到某個 JDK、或內附 JDK 的應用程式的整片佔用,每項帶大小,Mole 不用你事先知道路徑就能做到。
之後要檢查的三個地方
第一個是 shell 設定檔。寫在 ~/.zshrc 或
~/.zprofile 裡的手寫 JAVA_HOME,不會跟著 JDK 一起消失。它會繼續指向一個已經不存在的路徑,每個新開啟的 shell 都會繼承這個壞掉的變數。刪掉那一行,或改成 export JAVA_HOME=$(/usr/libexec/java_home),讓它跟著系統目前有的 JDK 走。
第二個是你的 IDE。JetBrains 工具和 Android Studio 會依專案記錄特定的 JDK 路徑,不會跟著系統變更更新,結果就變成指令列一切正常,某個專案卻建置失敗。
第三個是套件管理工具裝進來的東西。
brew list | grep -i -E 'jdk|temurin|zulu|openjdk' 可以看出 Homebrew 裝了哪些。
要用 brew uninstall 解除安裝;手動刪資料夾會讓套件資料庫仍以為它們還在。