🚀

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) にインストールされていることを前提としています。異なる場所にインストールした場合は、お使いの環境に合わせてパスを読み替えてください。

なお、Git Bash 環境でのパス指定は、Windows の C ドライブのパス C:\/c/ となり、パス区切り \/ となります。

これらを考慮すると、Git Bash でファイルをコピーするコマンドは次のようになります。

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