ツールチェーンを壊さずに Mac から Java を削除する
「Mac で Java をアンインストールする」という言葉には 2 つの問いが潜んでいます。間違った方に答えると、ツールチェーンが壊れます。1 つ目は、どの Java が入っているかです。2 つ目は、マシン上の何が、その存在を前提にしているかです。
Oracle 自身の手順は短く、その中で最も重要なのは手順ではなく、触れてはいけないディレクトリについての警告です。
/usr/bin から Java を削除しない
Oracle ははっきり書いています。/usr/bin から Java ツールを削除して Java をアンインストールしようとしてはいけない、と。そのディレクトリはシステムソフトウェアの一部であり、変更しても次の macOS アップデートで Apple が元に戻します。
これが、作業が失敗する最もよくあるパターンです。which java を打つと /usr/bin 配下のパスが返り、アンインストール先のように見えますが、そうではありません。macOS 上では、それらは実際にインストールされているランタイムを指すスタブです。削除しても看板が消えるだけで建物は消えず、あとで macOS が復元します。
削除しようとしている Java を把握する
ランタイムと開発キットは別のインストールであり、削除方法も異なります。
ブラウザプラグインと環境設定パネルを含むコンシューマ向けランタイムである Oracle JRE は、Oracle が挙げる 3 か所にあります。
/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 が、バージョンとパス付きで表示されます。一覧が 1 件なら選択は単純です。4 件あるなら、次の節が重要になります。
間違った JDK を消すと他のソフトが壊れる
Java が入っているのは、Java そのものを直接使うためであることがまれです。Android 向けツール、Elasticsearch、Minecraft ランチャー、JetBrains IDE、Apache ツール、いくつかの企業向け VPN や印刷クライアントは、いずれも JVM を同梱するか依存しています。独自コピーを同梱しているものは影響を受けません。システムが提供する JVM を参照しているものは、それが変わると動かなくなります。
パッケージマネージャで入れた JDK は、入れたときと同じ方法で外します。Homebrew で入れた temurin は brew uninstall で外れます。手でファイルを消すと、パッケージデータベース上はまだインストール済みのままになります。
サポートされている方法で JDK を削除する
.pkg から入れた JDK の場合、削除対象は /Library/Java/JavaVirtualMachines/ 配下で、名前にバージョンが付いたディレクトリです。sudo が必要です。一度に 1 バージョンだけ消し、次を消す前に、自分にとって重要なツールを確認してください。
その後、/usr/libexec/java_home -V にはもう表示されず、シェルプロファイルで手で設定した JAVA_HOME は存在しないパスを指したままになります。この変数は、正しく削除したあとにツールチェーンが失敗する原因として 2 番目に多いものです。
ターミナルを閉じる前に確認する
/usr/libexec/java_home -V
java -version
1 つ目は残っているものを示します。2 つ目はバージョンを表示するか、ランタイムがインストールされていないことを示します。意図的に空にしようとしたマシンでは、それはエラーではなく想定どおりの結果です。
フットプリント表示が役立つ場面
Java の残りものは小さく、あちこちに散らばり、目立ちません。確認すべきなのは一覧であり、ターミナルがすでにそれを表示してくれます。JDK や、JDK を同梱するアプリの全体フットプリントを、サイズ付きの一覧で一度に見たいなら、パスをあらかじめ知らなくても Mole で確認できます。
あとで確認すべき3つの場所
まず1つ目はシェルのプロファイルです。~/.zshrc や
~/.zprofile に手書きした JAVA_HOME は、JDK を消しても残り続けます。存在しないパスを指したままになり、
新しいシェルすべてがその壊れた変数を引き継ぎます。該当行を削除するか、export JAVA_HOME=$(/usr/libexec/java_home) に書き換えて、
システムが提供している JDK を追従させるようにしてください。
2つ目は IDE です。JetBrains 系ツールと Android Studio はプロジェクトごとに特定の JDK パスを記録しており、システムの変更には追従しません。その結果、コマンドラインでは問題ないのに、あるプロジェクトだけ ビルドに失敗する、という症状として現れます。
3つ目はパッケージマネージャが入れたものです。
brew list | grep -i -E 'jdk|temurin|zulu|openjdk' で Homebrew 経由のものが分かります。
これらは brew uninstall で削除してください。ディレクトリを手で消すと、
パッケージデータベース上はまだインストールされていると見なされたままになります。