【Java環境構築】WSL+SDKMAN!+VSCode で開発環境を構築する

![WSL 24.04.1](https://img.shields.io/badge/WSL-24.04.1-limegreen) ![SDKMAN! 5.18.2](https://img.shields.io/badge/SDKMAN!-5.18.2-limegreen) ![JDK 21](https://img.shields.io/badge/JDK%20Temurin-21.0.5-limegreen)

以前、 [【Java環境構築】Windows+Scoop+VSCode で開発環境を構築する](https://qiita.com/nimzo6689/items/72898eb9dc3896a41269) にて、Windows 内に Java 開発環境を作る記事を投稿しましたが、 WSL で構築する手順もついでに投稿しておきます。

:::note info
メモリに余裕があるのであれば、こちらの方がベターな気はします。プロジェクトに依存しますが、 16GB は必要という感覚です。 32 GB 積んでいるのであれば、 WSL で開発したい。
:::

構成図はこちらです。

```mermaid
flowchart LR
    subgraph Windows
        vscode["`**Visual Studio Code**<br/>(UI だけ)`"]
        remote["`**WSL 拡張機能**`"]
        vscode --> remote
    end

    subgraph WSL["`**WSL2 (Ubuntu)**`"]
        VSCodeServer["`**VSCode Server**`"]
        jdk["`**JDK 21**`"]
        maven["`**Maven**`"]
    end

    subgraph VSCodeServer["`**VSCode Server**`"]
        javaext["`**Extension Pack for Java**`"]
        javaext --> jdk
        javaext --> maven
    end

    remote --> VSCodeServer
    
    %% スタイリングの定義
    classDef default fill:#f9f9f9,stroke:#333,stroke-width:1px,font-size:14px
    classDef windows fill:#f0f4f8,stroke:#2d89ef,stroke-width:2px,color:#000,font-weight:bold
    classDef wsl fill:#f3e5f5,stroke:#9c27b0,stroke-width:2px,color:#000,font-weight:bold
    classDef server fill:#e8f5e9,stroke:#4caf50,stroke-width:2px,color:#000,font-weight:bold
    classDef component fill:#fff,stroke:#666,stroke-width:1px,rx:5px,color:#000,font-size:16px,font-weight:bold
    
    %% スタイルの適用
    class Windows windows
    class WSL wsl
    class VSCodeServer server
    class vscode,remote,jdk,maven,javaext component
```

# 1. WSL2 のインストール

Windows 10 ビルド 19041 以上、または、Windows 11 であれば、以下のコマンドだけで大丈夫です。

```powershell:PowerShell(管理者モード)
# OS のバージョンを確認
$PSVersionTable.OS
#=> Microsoft Windows 10.0.19045

# WSL をインストール
wsl --install

# インストールが完了すれば、wsl コマンドで Ubuntu を起動 & ログインする。
wsl
# 初回はユーザ名とパスワードを設定する。
```

これで Ubuntu ディストリビューションが WSL として利用できます。

それ以外の PC 環境の方は、以下の公式ページをご参照ください。

https://learn.microsoft.com/ja-jp/windows/wsl/install

# 2. SDKMAN! のインストール

では、 WSL の Ubuntu にて、 Java の開発環境をセットアップしていきます。
まずは、 JDK や Maven など、Java 関連のツールのパッケージマネージャである SDKMAN! をインストールします。

```bash
# apt の更新
sudo apt update && sudo apt upgrade -y

# 必要なパッケージのインストール
sudo apt install -y zip unzip curl

# SDKMAN! のインストール
curl -s "https://get.sdkman.io" | bash

# SDKMAN! を有効化（シェルの再起動でもよい）
source "$HOME/.sdkman/bin/sdkman-init.sh"

# SDKMAN! のインストール確認
sdk version

#=> SDKMAN!
#=> script: 5.18.2
#=> native: 0.4.6
```

SDKMAN! 使えるって、本当に幸せだよね。

# 3. Java 21 と Maven のインストール

SDKMAN! を使って、JDK と Maven をインストールします。
JDK は最新の LTS である 21 とし、ディストリビューションは Eclipse Temurin にします。

ちなみに、 SDKMAN! はバージョンや JDK のディストリビューションを指定してインストールすることができますが、単純に `sdk install java` とすると最新の Eclipse Temurin JDK の LTS がインストールされます。これは、 Eclipse Temurin がデファクトスタンダードとして扱われていて、デフォルトにすることで多くのユーザの便利に繋がる、のが理由だそうです。（意訳）

この記事では、再現性の確保のため、あえてバージョンとディストリビューションを指定してインストールしています。

```bash
# 利用可能な Java バージョンの確認（tem とかで検索する）
sdk list java

# Eclipse Temurin JDK 21 をインストール
sdk install java 21.0.5-tem
#=> Using:
#=> 
#=> java: 21.0.5-tem

# デフォルトの Java バージョンを確認
# 既に sdk で違う JDK をインストールしていた場合、
# `sdk default java 21.0.5-tem` で切替できます。
sdk current

# Java のバージョンの確認
java --version
#=> openjdk 21.0.5 2024-10-15 LTS
#=> ...

# JAVA_HOME の確認
# 以下の source コマンドを実行するか、シェルを再起動すれば設定が反映される
source "$HOME/.sdkman/bin/sdkman-init.sh"
echo $JAVA_HOME
#=> /home/nimzo6689/.sdkman/candidates/java/current

# Maven もインストール
sdk install maven

# Maven のバージョン確認
mvn --version
#=> Apache Maven 3.8.1 (05c21c65bdfed0f71a2f2ada8b84da59348c4c5d)
#=> ...
```

その他、 SDKMAN! の使い方については以下のページを参照ください。
Scoop 使われる人にとっては、同じようなサブコマンドで利用できます。

https://sdkman.io/usage

# 4. VSCode のセットアップ

VSCode で WSL 上の Java 開発環境を使うには、Microsoft 社が提供している WSL 拡張機能をインストールします。

https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-wsl

WSL 拡張機能を使うことで、我々は VSCode の UI のみ Windows で実行し、それ以外の開発作業（例えば、コマンドや拡張機能、ターミナル操作、ビルドと実行、デバッグ、など）を WSL としてインストールされた Linux 上で実行することができます。

## 4-1. VSCode で WSL を開く

VSCode で開く前に、先にディレクトリを WSL 側に作っておきます。

```bash
mkdir ~/repos/qiita
cd ~/repos/qiita
```

Windows の VSCode から WSL に接続する方法は２つです。
まず、ターミナル上で wsl に入り、そこで `code` コマンドで VSCode を起動することです。

```bash
pwd
#=> /home/nimzo6689/repos/qiita
code .
```

すると、 VSCode が起動し、ステータスバーの左下を見ると、WSL に接続できていることがわかります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114728/35e7ad8a-5818-9720-ecca-1866904dcdcf.png)

もう１つは、Windows で VSCode を起動し、ステータスバーの左下（上の画像で WSL: Ubuntu と表示されている箇所）をクリックし、コマンドパレットで `WSL: Connect to WSL` を選択することです。どちらの方法でも利用できるように覚えておくと便利だと思います。

WSL の接続を終了するときは、同じようにコマンドパレットから `Close Remote Connection` を選択すれば終了できます。

## 4-2. WSL に Java 拡張機能をインストールする

VSCode は Windows で動作していますが、これはあくまで UI 部分だけの話なので、拡張機能を利用したい場合は、たとえ Windows 上にインストールしていたとしても、 WSL 上で別途インストールする必要があります。

逆に言うと、 WSL 上で拡張機能をインストールしていれば、 Windows でインストールする必要はありません。

ここでは Windows 版の記事と同様、 [Extension Pack for Java](https://marketplace.visualstudio.com/items?itemName=vscjava.vscode-java-pack) をインストールします。

WSL 接続中に拡張機能をインストールしようとすると、「Install in WSL: Ubuntu」と表示されるようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114728/47b7a2ed-70e1-db17-14b0-9c8ea100d4ed.png)

# 5. プロジェクト作成と実行

これ以降の開発環境の構築や拡張機能の利用方法は Windows 版の記事と同じになるため、詳しくはそちらをご参照ください。ただ、せっかくなので簡単な動作確認用のコードだけ書いて、本記事を締めたいと思います。

1. コマンドパレット（Ctrl+Shift+P）を開く
2. 「Java: Create Java Project」を選択
3. Maven を選択してプロジェクトを作成
4. Group Id や Artifact Id、Destination Folder を選択して、ひな形を生成
5. pom.xml にて Java のバージョンを 21 に変更
6. 以下の Java コードを書いて実行

```java
public class Main {
    public static void main(String[] args) {
        System.out.println("Hello, " + System.getProperty("os.name") + " world!");
    }
}
```

これで無事 WSL の Ubuntu 上で実行ができました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114728/9fd93336-4248-9b1f-183f-f42beab0fcea.png)