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:
zip
とunzip
コマンドの追加 - 準備 2: シンボリックリンクの有効化
準備 1: zip と unzip コマンドの追加
SDKMAN!
は SDK をダウンロードした後、.zip
ファイルを展開(unzip)する必要があります。しかし、デフォルトの Git Bash には zip
と unzip
コマンドが含まれていません。
これを追加する最も簡単な方法は、次の手順で MSYS2 という別のツールから実行ファイルをコピーしてくることです。Git Bash は MSYS2
を含んでいるのですが、git
コマンドに必要な一部のライブラリとコマンドしかありません。そこに足りないコマンドを追加するという対応で SDKMAN!
を使えるようにしようという方針です。
- MSYS2 をインストール
- MSYS2 ターミナルで
zip
とunzip
をインストール - Git Bash にファイルをコピー
- 動作確認
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 を使うことにします。
インストール直後だと古いパッケージになっていることがあるので、最初にパッケージ管理システムの初期設定とアップデートをしておきます。
- 管理者権限で実行するターミナルで MSYS2 MSYS のターミナルを起動
- パッケージデータベースとコアパッケージを最新の状態するコマンドを実行
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.exe
と unzip.exe
を、Git Bash のコマンドが置かれているフォルダにコピーします。
-
コピー元: MSYS2 のインストールフォルダ内の
usr/bin
(ここではC:\msys64\usr\bin
) -
コピー先: Git for Windows のインストールフォルダ内の
usr/bin
(ここではC:\Program Files\Git\usr\bin
)
Git Bash を管理者モードで起動して、zip.exe
と unzip.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 をインストールする場合は、Identifier
が 21.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-tem
、25-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