Tambourine作業メモ

主にスキル習得のためにやった作業のメモ。他人には基本的に無用のものです。

macOSにJavaをインストールする

JavamacOSで特別な扱いをされている。

インストール直後から/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を入れてみることにする。

IBM Semeru Runtimeのインストール

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)