Mac 上解除安裝 Java,別弄壞工具鏈
「在 Mac 上解除安裝 Java」裡藏著兩個問題,答錯了,工具鏈就會壞掉。第一個是你裝了哪一種 Java。第二個是機器上還有什麼指望它在。
Oracle 自己的說明很短,其中最重要的那一行不是步驟,而是警告:有個目錄別去動。
開始刪除支援檔案前,先對照 Oracle JDK 的現行官方解除安裝說明。如果廠商提供自己的解除安裝程式或 App 內命令,應先走那條路徑,再處理能確認擁有者的殘留。
這份 Oracle 文件只涵蓋透過 Oracle .pkg 安裝的 JDK,不代表 Temurin、Homebrew 或 App 內建執行環境。
不要從 /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 的 App 佔了多少空間,可以用 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 解除安裝;手動刪資料夾會讓套件資料庫仍以為它們還在。