【Java】Mac で Java を利用するときに注意すべきエラーと対処法

## 概要
macOS で、PC ゲームの「Minecraft（マイクラ）」の Java版に Mod を導入しようと思って、使用 PC で初めて Java を利用した際に発生したエラーに対する対処法の備忘録。

### 前提
OS: macOS 13.3.1 (Ventura)
CPU: 3.2GHz 8コア Intel Xeon W

## 発生した事象
Mod を導入するための前提 Mod **「Minecraft Forge」** を導入するため、そのインストーラ（**forge-1.20.2-48.0.37-installer.jar**）をダウンロードしてダブルクリックで実行したら、以下のエラーメッセージが発生。

:::note info
「Mod」とは、一般には、ゲームを拡張・変更する非公式のプログラムやソフトウェアのこと。
:::

```
操作を完了できませんでした。
Unable to locate a Java Runtime.
Please visit http://www.java.com for information on installing Java.
```

![javaインストールエラー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/787582/530ca171-2813-d218-27cd-41bbe9a8c3d5.png)

### Java は Mac に入っているのに Java が動かない
Java が入ってないのかと思ったけど、PC にデフォルトで入ってる Java はいた

```bash
# バージョン確認
$ java --version

# 結果。Java は入っているようだ
openjdk 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)
```

### コマンドなら起動した
jar ファイルを直接コマンドで叩けば動きはした。

```bash
# 同じファイルをコマンドで実行
$ java -jar forge-1.20.2-48.0.37-installer.jar
　
# 動いた。これの後に GUI のダイアログも起動した。
JVM info: Homebrew - 20.0.1 - 20.0.1
java.net.preferIPv4Stack=true
Current Time: 13/11/2023 21:07:11
Host: files.minecraftforge.net [ xxx.xxx.xxx.xxx ]
Host: maven.minecraftforge.net [ xxx.xxx.xxx.xxx ]
Host: libraries.minecraft.net [ xxx.xxx.xxx.xxx ]
Host: launchermeta.mojang.com [ xxx.xxx.xxx.xxx ]
Host: piston-meta.mojang.com [ xxx.xxx.xxx.xxx ]
Host: authserver.mojang.com [ xxx.xxx.xxx.xxx, xxx.xxx.xxx.xxx ]
```

しかし、今後のことを考えて、同様のファイルのダブルクリックでも動くようにはしておきたいので、対処することにした。

## 原因
まず、Homebrew で入れた Java を確認すると、`openjdk` としてインストールされている。

```bash
# インストールパッケージ 一覧確認コマンド
$ brew list

==> Formulae
...（略）...    openjdk
```

次に、`openjdk` の詳細を確認。…すると、原因がわかった。

```bash
# パッケージ詳細確認コマンド
$ brew info openjdk

# 結果
==> openjdk: stable 20.0.1 (bottled) [keg-only]
Development kit for the Java programming language
https://openjdk.java.net/
/usr/local/Cellar/openjdk/20.0.1 (636 files, 322.4MB)
  Poured from bottle using the formulae.brew.sh API on 2023-05-15 at 02:11:59
From: https://github.com/Homebrew/homebrew-core/blob/HEAD/Formula/o/openjdk.rb
License: GPL-2.0-only with Classpath-exception-2.0
==> Dependencies
Build: autoconf ✔, pkg-config ✔
Required: giflib ✔, harfbuzz ✘, jpeg-turbo ✘, libpng ✘, little-cms2 ✘
==> Requirements
Build: Xcode (on macOS) ✔
Required: macOS >= 10.15 (or Linux) ✔
==> Caveats
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"
==> Analytics
install: 104,786 (30 days), 298,245 (90 days), 657,877 (365 days)
install-on-request: 58,928 (30 days), 166,877 (90 days), 389,585 (365 days)
build-error: 388 (30 days)
```

結果の一行目に **「keg-only」** とある。
つまり、以下の過去記事でも情報を載せているが、`openjdk` は Keg-only ＝ **「パッケージのインストール先（Keg）と実体ファイルがあるだけで、実行動作に必要なシンボリックリンクは作成しないタイプのもの」** であったようだ。

プログラムはインストールしてるけど動作に必要な設定は自動で行われないということを意味する。

#### 参考

https://qiita.com/to3izo/items/3171220733d0e2d18bfb

## 対処法・解決策
info の結果にある「Caveats」にあるように、表示された内容に従って各種コマンドをそのまま実行していく。

/usr/local にシンボリックリンクを設定する

```bash
sudo ln -sfn /usr/local/opt/openjdk/libexec/openjdk.jdk /Library/Java/JavaVirtualMachines/openjdk.jdk
```

PC の設定ファイル`~/.zshrc` に設定を追加する（未設定の場合のみ）
`cat ~/.zshrc` でPATHが未設定の場合のみ実行すれば良い。

```bash
# PATH 設定
echo 'export PATH="/usr/local/opt/openjdk/bin:$PATH"' >> ~/.zshrc
echo 'export CPPFLAGS="-I/usr/local/opt/openjdk/include"' >> ~/.zshrc

# 設定の反映
source ~/.zshrc
```

また、**JAVA_HOME の設定は** 不要のようだ。

これでさっきの jar ファイルをもう一度起動してみる。
どうやら成功した！ちゃんと起動する
![java導入成功.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/787582/60b376d9-7f1e-dc49-6cd9-e98a5c4d0c1b.png)

### その他の方法
別の Java パッケージをインストールする。こちらのシリーズは追加設定がいらない様子。

```bash
# cask でインストール
brew cask install java

# adoptopenjdk でインストール
brew cask install adoptopenjdk
```

## まとめ
つまり、「デフォルトの Java 使う時は、シンボリックリンクを貼ればオッケー」ということでした。