JAVA_HOME 環境変数設定と Java 複数バージョン切り替え

# はじめに

最近は複数バージョンの Java を使用して開発する機会が多くなってきました。本稿では簡単に Java のバージョンを切り替える方法をご紹介します。

**対象環境**
* Windows, Mac, Linux - VSCode
* Windows - Pleiades All in One

# VSCode での Java バージョン切り替え

Visual Studio Code の拡張機能 [Java Extension Pack Auto Config](https://marketplace.visualstudio.com/items?itemName=Pleiades.java-extension-pack-jdk) をインストールすると、複数の LTS JDK、gradle、maven がすぐに使用できます。インストールや JAVA_HOME、PATH などの環境変数設定が不要で、常に最新の状態で利用できます。asdf, Chocolatey, jabba, jEnv, Homebrew, IntelliJ, Pleiades, Scoop, SDKMAN, vfox などにより、すでに JDK がインストールされている場合は自動検出されます。

### ターミナルでのコマンド実行
VSCode のエディター機能を使用しない場合でも、単純に任意の Java バージョンで javac、gradle、mvn コマンドを実行できる Windows、macOS、Linux マルチプラットフォームなターミナルとして、設定無しで使用できます。以下のターミナルメニューから Java バージョンを選択して、複数のターミナルを開くことができます。

[![VSCodeターミナルでのJavaバージョン切り替え](https://raw.githubusercontent.com/cypher256/java-extension-pack/main/image/terminal.png?1)](https://marketplace.visualstudio.com/items?itemName=Pleiades.java-extension-pack-jdk)

### VSCode ユーザー設定全体
VSCode 上のビルドや実行などで使用される VSCode ユーザー設定全体 (settings.json) のデフォルト Java バージョンを切り替えるには、以下のいずれかから、Java バージョンを選択し「再読み込みして適用」ボタンを押します。
* ターミナルメニュー ≫ 既定のプロファイルの選択
* コマンド (Ctrl + Shift + P) ≫ Select Default Profile 

「キャンセル」するとターミナルのデフォルトには設定されますが、settings.json には反映されません。「既定のプロファイルの選択」は VSCode 標準の機能ですが、settings.json への一括反映は拡張機能によるものです。なお、Java バージョン設定はプロジェクト別にオーバーライドできます。[Specify Project Java Version](https://github.com/cypher256/java-extension-pack?tab=readme-ov-file#specify-project-java-version) を参照してください。
<br>

# Pleiads All in One 付属バッチで切り替え
### JAVA_HOME の設定が不要な人

Windows 版 [Pleiades All in One Java](https://willbrains.jp/) の Java Full Edition には、主要な LTS バージョンの Java が付属設定済みのため、JDK のダウンロードやインストールは不要です。

:::note info
Eclipse 上で使用する場合は JAVA_HOME や PATH 環境変数の設定も不要です。
:::

プロジェクト設定や実行構成で Java のバージョンを選択しておくことで、特に切り替え不要で Eclipse の実行メニューから Java メインクラスや Maven コマンドを実行したり、Gradle タスク・ビューから実行できます。

* Eclipse が使用する Java のバージョン
  * Eclipse 起動 VM は eclipse.ini の -vm 指定や直下の jre ディレクトリ。
  * Eclipse 上での Gradle や Maven、Java メイン、JUnit などの実行は、Eclipse 上の実行構成の指定。

* Eclipse のメニューからコマンドプロンプトを起動する場合の注意
　
Eclipse パッケージ・エクスプローラー右クリック（以下のいずれか）
方法1: コマンド・プロンプト (Windows のコマンドプロンプトが開く)
方法2: 表示 → ターミナル (Eclipse のビュー上で開く)
方法3: ローカル・ターミナルに表示 → ターミナル (同上)
  * 一時的に PATH 先頭に Eclipse 起動 VM の bin が追加される（JAVA_HOME 無視）。
  * JAVA_HOME は Eclipse 起動時の JAVA_HOME（Eclipse 設定は使用されない）。
　
👆 たとえば、PATH が Java 17 なのに、JAVA_HOME が 11 とかになり、java -version で確認すると 17 になる気持ち悪い状態になったりするという意味です。Eclipse 起動 VM 以外の Java バージョンでコマンドプロンプトを使用したい場合は、次項に従って JAVA_HOME を設定し、Eclipse からではなく Windows エクスプローラーのアドレスバーに cmd と入力するなどしてコマンドプロンプトを起動してください。

### JAVA_HOME の設定が必要な人

:::note info
コマンドプロンプトから Gradle や Maven などのコマンドを実行する場合、JAVA_HOME と PATH 環境変数の設定が必要です。
:::

ただ、頻繁に切り替える場合、GUI の環境変数設定ダイアログからの変更が面倒だったり、コマンド使うにしても **[setx を使ってはいけない理由](https://qiita.com/jeyei/items/05ce2739501832463b3b)** があったり、Windows 再起動が必要な場合があったり、色々考慮が必要だったします。なので、Pleiades All in One 付属の JDK を簡単確実に JAVA_HOME と PATH を設定できるように、2022-06 からは下記のバッチファイルが付属しています（*Mac 用はコマンドで JAVA_HOME を単純にセットするだけなので用意していません*）。

![Pleiades All in One の java ディレクトリ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45147/db29b499-adeb-16dc-8c76-dfb245fb9955.png)

#### 使い方
* set-JAVA_HOME-{n}.cmd をダブルクリック。{n} は設定したい Java のバージョン。
* show-JAVA_HOME.cmd は現在の JAVA_HOME や関連コマンドのバージョンを確認。

**例: set-JAVA_HOME-11.cmd 実行結果**
Java 17 から 11 に切り替えたときの表示は、こんな感じ。変更前/後の JAVA_HOME、変更後の PATH と java.exe、javac.exe のそれぞれのバージョンを確認表示します。すでに開いているコマンドプロンプトに反映するには、開きなおす必要があります。
![JAVA_HOME セットコマンドの実行結果](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45147/2c3b641e-161e-577b-8d8e-2f8402bafd49.png)

#### 参考: バッチファイルの処理内容
* PowerShell で管理者起動 (システム環境変数に設定するため) 
* setx コマンドで JAVA_HOME システム環境変数設定
* VBScript で PATH システム環境変数内の % 展開前の値を取得
* PATH に %JAVA_HOME%\bin が含まれていない場合は先頭に追加
* Chocolatey の RefreshEnv でレジストリに即時反映

https://qiita.com/cypher256