インストール直後から/usr/binにjavaコマンドは存在する。が、実行するとしょーもないことを言う。
tambara@TAMBARAnoMacBook ~ % /usr/bin/java The operation couldn’t be completed. Unable to locate a Java Runtime. Please visit http://www.java.com for information on installing Java.
こう言われたら、Javaが入ってないかちゃんとセットアップされていない状態である。
Javaは今ではいろいろなディストリビューションから提供されているし、バージョンも様々である。かつてはJavaで動作するアプリケーションをインストールすると、それが要求するJDK/JREがセットで導入されて、アプリケーションごとに山ほどJDK/JREがインストールされているなんてことがあったものだが、そういうのはよろしくないので、特別扱いで複数のJavaがインストール出来る仕組みが用意されている。そのため、Javaがインストールされるのは/Library/Java/JavaVirtualMachinesと決められている。インストール直後から放置の私のサブマシンではここはからっぽである。
では、まず基本として、brewのcoreにあるopenjdkをインストールしてみよう。brew install java
するとopenjdkがインストールされる。今、homebrewのcoreにあるjavaはopenjdkだけ。
インストールの最後に以下の様に表示される。
==> Summary 🍺 /usr/local/Cellar/openjdk/20.0.1: 637 files, 322.5MB ==> Running `brew cleanup openjdk`... Disable this behaviour by setting HOMEBREW_NO_INSTALL_CLEANUP. Hide these hints with HOMEBREW_NO_ENV_HINTS (see `man brew`). ==> Caveats ==> openjdk For the system Java wrappers to find this JDK, symlink it with sudo ln -sfn /usr/local/opt/openjdk/libexec/openjdk.jdk /Library/Java/JavaVirtualMachines/openjdk.jdk openjdk is keg-only, which means it was not symlinked into /usr/local, because macOS provides similar software and installing this software in parallel can cause all kinds of trouble. If you need to have openjdk first in your PATH, run: echo 'export PATH="/usr/local/opt/openjdk/bin:$PATH"' >> ~/.zshrc For compilers to find openjdk you may need to set: export CPPFLAGS="-I/usr/local/opt/openjdk/include"
openjdkは「keg-only」だと言っている。kegってのはビールの樽のことで、「注ぐのは自分でやってね」というコトらしい。シンボリックリンクなんかは作らないので自分でやってくれと。というわけで、
sudo ln -sfn /usr/local/opt/openjdk/libexec/openjdk.jdk /Library/Java/JavaVirtualMachines/openjdk.jdk
しろと仰せ。する。
すると、javaコマンドが動き出す。
tambara@TAMBARAnoMacBook ~ % java -version openjdk version "20.0.1" 2023-04-18 OpenJDK Runtime Environment Homebrew (build 20.0.1) OpenJDK 64-Bit Server VM Homebrew (build 20.0.1, mixed mode, sharing)
/Library/Java/JavaVirturalMachines以下に1つしかJDKがないと、そのままそれを使ってくれる。PATHをセットする必要はない。このJavaは/usr/bin/javaだと認識されている。
tambara@TAMBARAnoMacBook ~ % which java /usr/bin/java
また、今はだいぶ必要性が失われているが、かつてはJAVA_HOMEという環境変数が必要なことも多かった。今、何もしていないのでJAVA_HOMEは定義されていないが、定義したければ/usr/libexec/java_homeというコマンドが用意されているので、この出力がJAVA_HOMEに入るようにすればよい。-Vで今、システムに認識されているJDKを一覧してくれる。
tambara@TAMBARAnoMacBook ~ % /usr/libexec/java_home /usr/local/Cellar/openjdk/20.0.1/libexec/openjdk.jdk/Contents/Home tambara@TAMBARAnoMacBook ~ % /usr/libexec/java_home -V Matching Java Virtual Machines (1): 20.0.1 (x86_64) "Homebrew" - "OpenJDK 20.0.1" /usr/local/Cellar/openjdk/20.0.1/libexec/openjdk.jdk/Contents/Home /usr/local/Cellar/openjdk/20.0.1/libexec/openjdk.jdk/Contents/Home
さて、別のJDKを入れてみよう。変わっているところで、IBM Semeru Runtimeを入れてみよう。これはかつて別のところで提供されていたIBMのOpenJ9というJVMだ。IBMの製品に添付されているJVMなので、作ったアプリがWebSphereで動く予定なら使ってみてもいいかもしれない。
https://developer.ibm.com/languages/java/semeru-runtimes/downloads/
に行き、適切なバージョンをダウンロードしよう。今度は最新のLTSであるJava17を入れてみることにする。
java_homeコマンドを実行してみよう。
tambara@TAMBARAnoMacBook ~ % /usr/libexec/java_home -V Matching Java Virtual Machines (2): 20.0.1 (x86_64) "Homebrew" - "OpenJDK 20.0.1" /usr/local/Cellar/openjdk/20.0.1/libexec/openjdk.jdk/Contents/Home 17.0.8 (x86_64) "IBM Corporation" - "IBM Semeru Runtime Open Edition 17" /Library/Java/JavaVirtualMachines/ibm-semeru-open-17.jdk/Contents/Home /usr/local/Cellar/openjdk/20.0.1/libexec/openjdk.jdk/Contents/Home
増えている。
java_homeコマンドに-vとバージョンを指定すると、JAVA_HOMEに指定するべきパスが変わる。
tambara@TAMBARAnoMacBook ~ % /usr/libexec/java_home -v 17.0.8 /Library/Java/JavaVirtualMachines/ibm-semeru-open-17.jdk/Contents/Home
これをJAVA_HOMEにセットしてやると、/usr/bin/javaの動きが変わる。
tambara@TAMBARAnoMacBook ~ % export JAVA_HOME=`/usr/libexec/java_home -v 17.0.8` tambara@TAMBARAnoMacBook ~ % echo $JAVA_HOME /Library/Java/JavaVirtualMachines/ibm-semeru-open-17.jdk/Contents/Home tambara@TAMBARAnoMacBook ~ % java --version openjdk 17.0.8 2023-07-18 IBM Semeru Runtime Open Edition 17.0.8.0 (build 17.0.8+7) Eclipse OpenJ9 VM 17.0.8.0 (build openj9-0.40.0, JRE 17 Mac OS X amd64-64-Bit Compressed References 20230718_503 (JIT enabled, AOT enabled) OpenJ9 - d12d10c9e OMR - e80bff83b JCL - 77b0f754805 based on jdk-17.0.8+7)