OracleのJDKに対するライセンスが変わってから、複数からJDKが配布され利用するようになりました。ここで改めてJDKのバージョン切替方法を整理します。
JDKの現状
プログラミング言語にJavaを使って開発をするとき、必要になるのがJDKです。
Javaはインタープリタを介した言語ですが、コンパイルを必要とします。
JDKには実行環境とコンパイル環境が含まれています。
これまでに複数バージョンがリリースされています。
これから最新のバージョンと古いバージョンのJDKを両方インストールして、JDKのバージョンを切り替えながら利用したい場合はいくつか考慮すべき点があります。
現在はOracleが提供しているJDK(通称OracleJDK)はサポートが有償です。
それに伴って、GPLライセンスで配布されているOpenJDKが存在しています。
OracleJDKも個人的な利用については無償なので、学習目的の場合はこれまでのようにOracleからJDKをダウンロード&インストールして利用できます。
ですが、Oracleから最新のJDK以外をダウンロードするにはOracleプロファイル(アカウント)を作成する必要があります。
Oracleプロファイル作成のときには様々な情報の入力が必要です。
住所・氏名・会社名・勤務先電話番号など会社での利用を想定しているので個人では避けたい人も多いと思います。
このような状況になると多くの人はOpenJDKを利用することになるのかと思います。
OracleJDKとOpenJDKには大きな差異はないとされています。
この記事ではそれぞれのプラットフォームでJDKのインストールと異なったバージョンのJDKをインストールした際の切替方法を整理します。
JDKの種類
OracleJDK
まずはOracleJDKについて、これまでと同じようにOracleサイトからダウンロードしてインストールします。
Linux、macOS、Windows用にそれぞれパッケージやインストーラーのファイルをダウンロードできます。
ですが、JDK8(LTS), JDK11(LTS)のダウンロードはオラクルのアカウントでログインする必要があります。
OpenJDK
OpenJDKは2006年にサン・マイクロシステムズがJavaをオープンソース化する意志があることを発表してできたコミュニティです。
Java仮想マシン、コンパイラとGPLライセンス化できないライブラリを除いてオープンソース化されています。
なので中身はOracleJDKとほぼ同じです。
OpenJDKは以下のサイトからダウンロードしてインストールします。
ページには最新版のリンクが表示されています。
Linux、macOS、Windowsとそれぞれのビルドが用意されていますが、インストーラー形式ではないので、個々に展開して環境を作成します。
過去のJDKバージョンは以下からダウンロードできます。
ただ、JDK8以前のものは掲載していません。
AdoptOpenJDK
現在AdoptOpenJDKはEclipseファンデーションによって運営されています。JDKのインストーラーがJVMによって異なります。ですが、基本的な動作は同じなので記事の内容と同じ内容でインストール可能です。掲載している画像を現在のインストーラーの画面に置き換えてください。
AdoptOpenJDKはOpenJDKを安定して信頼できる形で配布する目的で立ち上げられたコミュニティです。
Amazon、IBM、Microsoftなどが参加しています。
AdoptOpenJDKの特徴的なところは、インストールするパッケージに含まれるJava仮想マシン(JVM)の種類を選べるところです。
OpenJDKから提供されているHotSpotか、Eclipseから提供されているOpenJ9のどちらかを選択することができます。
サイトにアクセスすると自動的にプラットフォームを識別して最新版をダウンロードできるようになっています。
Other platformsページに行くと、Linux、macOS、WindowsのJDKがダウンロードできます。
それぞれのプラットフォームごとにインストーラー形式のファイルもダウンロードすることができます。
バージョンはJDK8から提供されています。
AdoptOpenJDKのメリットは、JVMを選択できることです。
Oracle提供のJVMを使用できますが、OpenJ9を使用することもできます。
OpenJ9はOracle製のJVMよりメモリ消費量も低く高速であるといわれています。
おすすめのJDKインストール
Mac・Linux・Windowsそれぞれのおすすめインストール方法です。
MacとLinuxのおすすめJDKインストール方法
複数のJDKをインストールすることを前提としています。
イントール・アンイストールをよりしやすくするためにパッケージ管理ツールを使います。
MacおよびLinuxともにHomebrewでパッケージ管理を行います。
Homebrewを使うことでどちらのOSでも同じ管理と操作で作業できるようになります。
Homebrewのインストールは以下のサイトからシェルスクリプトをコピーしてターミナルで実行して行います。
HomebrewでJDKをインストールしますが、ここではAdoptOpenJDKをインストールします。
HomebrewによるJDKのインストール方法は以下のサイトに掲載されています。
https://github.com/AdoptOpenJDK/homebrew-openjdk
ここではこの内容を簡単に説明します。
HomebrewはAdoptOpenJDKのパッケージも管理できます。
最新のJDKをインストールするだけなら以下のコマンドでインストールできます。
$ brew install --cask adoptopenjdk
その時点の最新のJDKがインストールされます。
バージョン指定してインストールし、複数のバージョンを切り替えて使いたい場合は以下のようにします。
$ brew tap AdoptOpenJDK/openjdk
$ brew install --cask <version>
まずはtapコマンドにより公式リポジトリ以外のリポジトリからもパッケージのインストールを可能にします。
これはAdoptOpenJDKのopenjdkリポジトリからのインストールを有効にしています。
そのあと指定したバージョンのJDKをインストールします。
以下はJDK14をインストールした例です。
$ brew tap AdoptOpenJDK/openjdk
$ brew install --cask adoptopenjdk14
どんな種類のパッケージがどの名前であるのかは以下のコマンドか
$ brew search adoptopenjdk
もしくは
「https://github.com/AdoptOpenJDK/homebrew-openjdk#available-versions」のリンクから確認することができます。
MacとLinuxのJDKバージョン切り替え
複数のバージョンをインストールしたときは以下の記述を.bashrcもしくは.zshrcに記述して、シェルスクリプトを実行しバージョンの切り替えを可能にします。
jdk() { version=$1 export JAVA_HOME=$(/usr/libexec/java_home -v "$version"); java -version }
記述した直後は以下のコマンドでこの記述を有効にします。
$ source ~/.bashrc
or
$ source ~/.zshrc
バージョンを切り替えるには以下のようにコマンドを入力します。
$ jdk 14
$ jdk 11
Java(JDK)はJAVA_HOME環境変数によって実行するJavaを見ています。
そのパスをjava_homeコマンドで切り替えることができるようになっているんですね。
ちなみに、Macでは「/Library/Java/JavaVirtualMachines」配下にJDKがインストールされます。
ここにある各JDKのパスをJAVA_HOME環境変数に設定することで実行環境を切り替えます。
AdoptOpenJDKはインストールパッケージを提供しているので、指示に従ってインストールするだけです。
WindowsのおすすめJDKインストール方法
ここではWindowsに直接インストールする方法を説明しますが、WSL2の環境がある場合はMac・Linuxと同様にHomebrewを使ってJDKをインストールすることができます。
Windowsに直接インストールするときもAdoptOpenJDKを使うのがシンプルです。
「Set JAVA_HOME variable」のアイコンをクリックして、メニューから「ローカルハードドライブにすべてインストール」を選択すると、インストール時にJAVA_HOME環境変数を設定してくれます。
Windows用のインストールパッケージはインストールすると自動的にPATH環境変数の設定に以下の設定は追加されます。
%JAVA_HOME%\bin
これによりJAVA_HOME環境変数に設定されたパスのコマンドが実行されます。
JAVA_HOME環境変数は様々なJava関連のプログラムが参照する環境変数です。PATH環境変数と関連付けることで対象のバージョンのJavaで確実に動作します。
もし、PATH環境変数に上記記述がない場合は追加してください。
WindowsのJDKバージョン切り替え
WSL2にインストールした場合は、Mac・Linuxと同じ方法で切り替えることができます。
ここではまずは、直接AdoptOpenJDKをWindowsにインストールした場合の方法について説明します。
他のJDKについてもJavaコマンド類を使用するためにPATH環境変数を編集すると思います。
そして、PATH環境変数に設定しているのは「%JAVA_HOME\bin」です。
なので、JAVA_HOME環境変数に設定されているパスを変更することでJavaのバージョンを切り替えることができます。
上記の画像ではAdoptOpenJDKをインストールしたときの例を表示していますが、他の種類のJDKの場合でもパスの記述を書き換えることで利用したいJDKバージョンを指定できます。
JDKのインストールパスを簡単にしてPowershellスクリプトでバージョンを切り替える
JDKをインストールするときのパスを短くしてスクリプトを実行してバージョンを切り替える方法を説明します。
できるだけ短く簡単なスクリプトとするためにJDKのインストールをできるだけ完結なパスにします。
例えば、「c:\jdk-11」などです。
このパスが設定されているJAVA_HOME環境変数の内容を書き換えを手動ではなく、スクリプトを実行してできるようにして、より簡単に切り替えれるようにします。
ここでは、複数インストールされているJDKのパスが「c:\jdk-11」や「c:\jdk-16」など、「c:\jdk-○○」となっていることとします。
まずPowershellで動作するスクリプトを記述します。
VSCodeなどのエディタを使って次のスクリプトを書いてください。
param ($Version = $(throw "Version parameter is required.")) setx JAVA_HOME "c:\jdk-$Version" /m
そして、ファイル名を「jdk.ps1」としてホームディレクトリーに保存します。
このスクリプトは、1行目のコードでパラメターにバージョン番号を受け取るようにしています。
なので実行するときはパラメーター付けて実行します。例えば、「./jdk.ps1 -Version 11」とコマンド入力します。
そして2行目のコードで1行目で受け取ったバージョンでパスを作成して、そのパスをJAVA_HOME環境変数に設定します。
Windowsでは独自のシェルスクリプトを実行するには、はじめにシステムに許可を設定する必要があります。
次のコマンドをPowershellで実行してください。
Set-ExecutionPolicy RemoteSigned
変更はすぐに有効になります。
このコマンドは1度実行するだけでいいので、以降は必要ありません。
あとは先程作成したスクリプトを実行するだけなのですが、JAVA_HOME環境変数を書き換えて有効にためにスクリプトの2行目はレジストリの内容を変更します。
なのでこのスクリプトは管理者権限で実行する必要があります。
そのためjdk.ps1スクリプトを実行するときはPowershellを管理者権限で起動してください。
そしてスクリプトを実行して正しく動作すると「成功」と表示されます。
バージョンが切り替わったことを確認するには新しくPowershellを起動してコマンドを実行します。
java --version openjdk 19 2022-09-20 OpenJDK Runtime Environment (build 19+36-2238) OpenJDK 64-Bit Server VM (build 19+36-2238, mixed mode, sharing)
スクリプトを使えばバージョンを簡単に切り替えることができます。
バージョンを頻繁に切り替える必要があるときはこの方法を考えてみてください。