🚀

Windows でも快適 Java 開発 - SDKMAN! でスマートなバージョン管理

に公開

はじめに

「新しいプロジェクトのために Java 21 が必要だけど、今の環境は Java 8...」
「複数の Java バージョンを切り替えながら開発するのが面倒...」

Windows で Java 開発をしていると、こんな悩みにぶつかることはありませんか?

この記事では、そんな悩みを解決してくれる最高のツール SDKMAN! を、Windows 環境で使うための方法を丁寧に解説します。公式サイトは次の URL にあります。

SDKMAN! はもともと Linux や macOS 向けのツールですが、いくつかのステップを踏むだけで、Windows でもその強力な恩恵を受けられます。この記事を読めば、あなたもコマンド一つで Java のバージョンを切り替えられる、スマートな開発環境を手に入れることができます!

なお、筆者は主に Ubuntu Desktop を使っているため、Windows でも WSL Ubuntu や Docker や開発コンテナ(Dev Container)を使っています。そのため、Windows 用の Java 環境を SDKMAN! で管理することへのモチベーションはそれほど高くありません。ただ、Windows 環境で SDKMAN! が使えるのに、その情報があまり日本語で紹介されていない気がするので、今回調べて動作確認をしてみたという次第です。

1. なぜ準備が必要? Windows と SDKMAN! の関係

SDKMAN! は、Java をはじめとする様々なソフトウェア開発キット(SDK)のバージョンを管理するためのツールです。しかし、その心臓部は Linux や macOS で使われるシェルスクリプトでできています。

そのため、Windows の標準的なコマンドプロンプトや PowerShell では、残念ながらそのまま動かすことができません。

そこで登場するのが、Git Bash です。

Git for Windows をインストールするとついてくるこのツールは、MSYS2 という技術がベースになっています。これは Windows 上で Linux ライクなコマンド操作を可能にする環境を提供してくれます。

つまり、Git Bash を「仲介役」として使うことで、Windows 上で SDKMAN! を動かすことができるのです。

この記事では、Git Bash をベースに環境を整えていきます。まだインストールしていない方は、管理者権限で実行するターミナルで winget コマンド(Windows Package Manager)を使ってインストールしておきましょう。

winget install -e --id Git.Git

なお、次の公式サイトを参照して、インストールしても良いです。

インストールしたら、Docker や WSL Linux 利用時にトラブルになりにくい設定としておくのが良いです。筆者の場合は、ユーザー権限で Git Bash を起動して、次のコマンドを実行して設定を更新することにしています。インストール時に使った管理者権限で実行するターミナルを使わないようにしてください。

git config --global core.autocrls false
git config --global init.defaultBranch main

設定内容については、次の解説の「Git for Windows」のセクションを参考にしてください。

2. SDKMAN! インストールのための準備

SDKMAN! をインストールする前に、いくつか小さな準備が必要です。Git Bash を開いて、一緒に進めていきましょう!

  • 準備 1: zipunzip コマンドの追加
  • 準備 2: シンボリックリンクの有効化

準備 1: zip と unzip コマンドの追加

SDKMAN! は SDK をダウンロードした後、.zip ファイルを展開(unzip)する必要があります。しかし、デフォルトの Git Bash には zipunzip コマンドが含まれていません。

これを追加する最も簡単な方法は、次の手順で MSYS2 という別のツールから実行ファイルをコピーしてくることです。Git Bash は MSYS2 を含んでいるのですが、git コマンドに必要な一部のライブラリとコマンドしかありません。そこに足りないコマンドを追加するという対応で SDKMAN! を使えるようにしようという方針です。

  1. MSYS2 をインストール
  2. MSYS2 ターミナルで zipunzip をインストール
  3. Git Bash にファイルをコピー
  4. 動作確認

1. MSYS2 をインストール:

もし PC に MSYS2 がインストールされていない場合は、winget を使ってインストールします。

MSYS2 のパッケージ ID は MSYS2.MSYS2 です。管理者権限で実行するターミナルで、これを指定するインストールコマンドを実行します。

winget install -e --id MSYS2.MSYS2

次の公式サイトからインストーラーをダウンロードしてインストールしても良いです。

インストールが完了すると、いくつかのショートカットが作成されます。MSYS2 の各環境について説明を表にしました。この表では MSYS2 MSYS のショートカットを環境名 MSYS のように表記してあります。

環境名 C ランタイム (CRT) 目的/特徴
MSYS Cygwin ベース MSYS2 の基盤。Unix ライクな基本ツール(bash, make, grep など)の実行とパッケージ管理用
UCRT64 UCRT (Universal CRT) 現在推奨されるデフォルト環境で、x86_64 Windows アプリのビルド用
MINGW64 MSVCRT (旧式) 古い Windows 環境との互換性を重視する x86_64 Windows アプリのビルド用
CLANG64 UCRT (Universal CRT) Clang/LLVM ツールチェーンを使用する x86_64 Windows アプリのビルド用
CLANGARM64 UCRT (Universal CRT) Clang/LLVM ツールチェーンを使用する AArch64 Windows アプリのビルド用

通常は MSYS2 UCRT64 を使えば良いです。ただし、今回はパッケージ管理周りの作業をするので、MSYS2 MSYS を使うことにします。

インストール直後だと古いパッケージになっていることがあるので、最初にパッケージ管理システムの初期設定とアップデートをしておきます。

  1. 管理者権限で実行するターミナルで MSYS2 MSYS のターミナルを起動
  2. パッケージデータベースとコアパッケージを最新の状態するコマンドを実行

MSYS2 用のパッケージ管理のコマンドは pacman で、パッケージデータベースとコアパッケージを最新の状態するには -Syuu をオプションに指定します。

pacman -Syuu

このコマンドは、指示に従って複数回実行する必要があります。プロンプトが表示されたら Y を入力します。

なお、途中でターミナルを再起動するように求められたら、一度ターミナルを閉じてから再度起動し、pacman -Syuu を再度実行してください。コンソールに「nothing to do」と表示されるまで繰り返します。

これにより、MSYS2 のインストールが完了し、pacman を使ったツール系のコマンドのインストールができるようになります。

2. MSYS2 ターミナルで zip と unzip をインストール:

MSYS2 のインストールが終わったら、管理者権限で MSYS2 MSYS などのターミナルを起動し、次のコマンドを実行します。pacman というパッケージ管理ツールが、必要なファイルをダウンロードしてくれます。プロンプトが表示されたら Y を入力します。

pacman -S zip unzip

3. Git Bash にファイルをコピー:

次に、MSYS2 がインストールした zip.exeunzip.exe を、Git Bash のコマンドが置かれているフォルダにコピーします。

  • コピー元: MSYS2 のインストールフォルダ内のusr/bin (ここでは C:\msys64\usr\bin)
  • コピー先: Git for Windows のインストールフォルダ内のusr/bin (ここでは C:\Program Files\Git\usr\bin)

Git Bash を管理者モードで起動して、zip.exeunzip.exe の 2 つのファイルを見つけて cp コマンドでコピーします。Windows のエクスプローラーでコピー&ペーストしても良いです。

なお、次のコマンドは MSYS2 と Git for Windows がデフォルトのパス (C:\msys64, C:\Program Files\Git) にインストールされていることを前提としています。異なる場所にインストールした場合は、お使いの環境に合わせてパスを読み替えてください。

for f in zip.exe unzip.exe; do
  cp /c/msys64/usr/bin/${f} '/c/Program Files/Git/usr/bin/'
done

4. 動作確認:

Git Bash を再起動し、次のコマンドを実行してみましょう。それぞれのコマンドのパスが表示されれば成功です!

for c in zip unzip; do which ${c}; done

実行例は次のとおりです。

$ for c in zip unzip; do which ${c}; done
/usr/bin/zip
/usr/bin/unzip

準備 2: シンボリックリンクの有効化

SDKMAN! は、インストールした SDK の場所を「シンボリックリンク」という仕組みで管理します。これは Windows の「ショートカット」に似た機能です。

Git Bash でこの機能を正しく動作させるために、設定ファイル .bashrc に一行追加します。

.bashrc は、Git Bash を起動するたびに読み込まれる設定ファイルで、Git Bash だとホームディレクトリ(~)にあります。

ユーザー権限で起動した Git Bash で次のコマンドを実行して ~/.bashrc ファイルに設定を追記します。

echo "export MSYS=winsymlinks:lnk" >> ~/.bashrc

Git Bash を再起動するか、次のコマンドを実行して設定内容を現在のターミナルに反映させます。

source ~/.bashrc

これで全ての準備が整いました!

3. いよいよ SDKMAN! をインストール

準備お疲れ様でした! いよいよ SDKMAN! をインストールします。ここからはユーザー権限で起動した Git Bash のターミナルを使い、管理者権限のターミナルは使いません。

公式サイトの https://sdkman.io/ に書かれているコマンドを Git Bash に貼り付けて実行するだけです。

curl -s "https://get.sdkman.io" | bash

スクリプトが実行され、最後に次のようなメッセージが表示されます。

(略)
Please open a new terminal, or run the following in the existing one:

    source "/c/Users/User/.sdkman/bin/sdkman-init.sh"

Then issue the following command:

    sdk help

Enjoy!!!

指示に従い、source コマンドを実行して SDKMAN! を有効化しましょう。/c/Users/User$HOME のことなので、ここでは入力を少なくするために置き換えています。

source "$HOME/.sdkman/bin/sdkman-init.sh"

最後に、sdk コマンドが使えることを確認するために、sdk version コマンドでバージョン情報を表示してみます。

sdk version

実行例は次のようになります。

$ sdk version

SDKMAN!
script: 5.20.0
native: 0.7.14 (windows x86_64)

これができたら、インストールは成功です!🎉

4. SDKMAN! を使ってみよう (Java のインストール例)

それでは、実際に SDKMAN! を使って Java をインストールしてみましょう。

利用可能な Java のバージョンを確認

sdk list java コマンドで、インストール可能な Java のバージョン一覧が表示されます。数が多いので、驚くかもしれません!

sdk list java

表示を終了するには q を入力します。

grep コマンドと組み合わせると、特定のバージョンの候補を絞り込めます。例えば、Temurin ディストリビューションの Java 21 を探してみましょう。Temurin ディストリビューションの Identifier には -tem が含まれるので、次のようなコマンドを使います。

sdk list java | grep 21 | grep tem

実行例は次のようになります。

$ sdk list java | grep 21 | grep tem
               |     | 21.0.8       | tem     |            | 21.0.8-tem

Java をインストール

一覧からインストールしたいバージョンを見つけたら、21.0.8-tem などの Identifier をコピーして sdk install コマンドを実行します。

たとえば、Temurin の Java 21.0.8 をインストールする場合は、Identifier21.0.8-tem なので、次のようにします。

sdk install java 21.0.8-tem

インストールが完了すると、このバージョンをデフォルトにするか聞かれることがあります。その場合に Y と答えると、今後新しいターミナルを開いたときに、この Java バージョンが自動的に使われるようになります。なお、デフォルトにしない場合は n と答えます。

どのパスに Java がインストールされたか確認するには which java コマンドを実行します。実行例は次のようになります。

$ which java
/c/Users/User/.sdkman/candidates/java/current/bin/java

Java のバージョンを確認するには java -version コマンドを実行します。実行例は次のようになります。

$ java -version
openjdk version "21.0.8" 2025-07-15 LTS
OpenJDK Runtime Environment Temurin-21.0.8+9 (build 21.0.8+9-LTS)
OpenJDK 64-Bit Server VM Temurin-21.0.8+9 (build 21.0.8+9-LTS, mixed mode, sharing)

ここまで確認したら、一度、Git Bash を終了してから、起動しなおします。なお、再起動すると、次のようなメッセージが表示されて ~/.bash_profile が自動で作成されます。

WARNING: Found ~/.bashrc but no ~/.bash_profile, ~/.bash_login or ~/.profile.

This looks like an incorrect setup.
A ~/.bash_profile that loads ~/.bashrc will be created for you.

これについては、~/.bash_profile というファイルも必要だということで自動作成されるものなので、そのまま次に進んで良いです。

現在のバージョンを切り替え

ここでは、17.0.16-tem25-tem を追加でインストールし、どちらもデフォルト設定については n と入力したとします。インストールされている Java は sdk list java | grep installed で確認できます。>>> がついているものが、現在使用することになっているものです。

$ sdk install java 17.0.16-tem
$ sdk install java 25-tem
$ sdk list java | grep installed
 Temurin       |     | 25           | tem     | installed  | 25-tem
               | >>> | 21.0.8       | tem     | installed  | 21.0.8-tem
               |     | 17.0.16      | tem     | installed  | 17.0.16-tem

Java について複数のバージョンをインストールしてある場合は、sdk use コマンドで簡単に切り替えることができます。

Temurin の Java 25(25-tem)をインストールしてあって、これを使う場合は次のようにします。

sdk use java 25-tem

実行例は次のようになります。sdk use java 25-tem 実行後は、java コマンドのバージョンが Java 25 のものになることがわかります。

$ sdk use java 25-tem

Using java version 25-tem in this shell.

$ java -version
openjdk version "25" 2025-09-16 LTS
OpenJDK Runtime Environment Temurin-25+36 (build 25+36-LTS)
OpenJDK 64-Bit Server VM Temurin-25+36 (build 25+36-LTS, mixed mode, sharing)

ここで、本来だと sdk current コマンドで、現在使用している SDK の一覧を確認できます。ただし、Windows 版だときちんと動作しないようでした。

sdk current

Windows での実行例は次のようになります。

$ sdk current
No candidates are in use.

$ sdk current java
No current version of java configured.

このように、sdk コマンドの一部の機能は使えませんが、Windows へインストールする Java の管理は可能です。Java の各バージョンを手動でインストールするよりは、これを使った方が楽になります。

PowerShell から Java を利用

ちなみに、Windows の PowerShell だと sdk コマンドは使えませんが、java コマンドの方は実行できます。実行例は次のようになります。

PS C:\Users\User> C:\Users\User\.sdkman\candidates\java\21.0.8-tem\bin\java -version
openjdk version "21.0.8" 2025-07-15 LTS
OpenJDK Runtime Environment Temurin-21.0.8+9 (build 21.0.8+9-LTS)
OpenJDK 64-Bit Server VM Temurin-21.0.8+9 (build 21.0.8+9-LTS, mixed mode, sharing)

環境変数の JAVA_HOME を設定したり、使用する java コマンドを含むフォルダのパスを PATH へ追加すれば、Windows 版の Java を普通にインストールしたときと同様に使えます。

ここで、Java 用の IDE などは、プロジェクト単位で使用する Java の環境を簡単に切り替えができる設定が可能となっています。SDKMAN! で Java をインストールするように標準化しておけば、設定の共通化がしやすくなります。ターミナルで java コマンドを実行するときにも、SDKMAN! を使うようにすれば標準化がしやすくなります。

デフォルトバージョンの設定

sdk use は現在のシェル(ターミナル)でのみ有効なバージョンを切り替えるコマンドです。新しいターミナルを開いたときに使われるデフォルトのバージョンを設定するには sdk default コマンドを使います。

例えば、Temurin の Java 21.0.8 をデフォルトに設定する場合は、次のように実行します。

sdk default java 21.0.8-tem

これにより、常に指定したバージョンの Java が有効な状態でターミナルを開始できます。

SDK のアンインストール

不要になったバージョンは sdk uninstall で削除できます。

sdk uninstall java 25-tem

まとめ

今回は、Windows 環境に SDKMAN! を導入し、Java のバージョンをスマートに管理する方法を解説しました。

  • Git Bash を「仲介役」として利用
  • Git Bash に zip/unzipコマンドを追加
  • Git Bash でシンボリックリンクを有効化
  • curl コマンドで SDKMAN! をインストール
  • sdk コマンドで Java のインストールや切り替えが自由自在

これでもう、プロジェクトごとに異なる Java のバージョンの環境切り替えについて悩まされることはありません。

SDKMAN! は Java 以外にも Gradle, Maven, Spring Boot CLI, Kotlin, Groovy, Scala など、多くの Java ベースの開発ツールに対応しています。ぜひ sdk list でどんなツールがあるか覗いてみてください。

また、SDKMAN! を使うことになれると WSL Ubuntu、macOS、Ubuntu Desktop、Dev Container でも同じように SDKMAN! で Java のバージョン管理ができるようになります。つまり、開発環境の標準化がしやすくなるということで、そういった意味からも、これを導入する価値があります。

快適な Windows 開発ライフを応援しています!

Discussion