VS Code と Docker で始める!シンプルな Java 開発入門

に公開

はじめに

この記事では、Visual Studio Code (VS Code) と Docker を使って Java プログラミングを始めるための、最もシンプルで標準的な方法を解説します。ビルドツール(Maven/Gradle)は使わず、VS Code の拡張機能だけで完結するプロジェクトの作成、コーディング、デバッグ、テストまでの一連の流れを実践的に学びます。

なお、この記事の VS Code では Copilot の画面を閉じた状態で画面キャプチャしてあります。ご承知ください。

環境構築

本記事では、開発環境の差異をなくし、すぐに Java 開発を始められるように、Visual Studio Code の Dev Containers 拡張機能と、筆者が提供する開発コンテナーイメージ hiro345g/dvc:jdk-202507 を使用します。

前提条件

お使いの PC に VS Code がインストールされている必要があります。

また、次の VS Code 拡張機能もインストールしておいてください。

ほかにも、次のツールが必要です。

PowerShell を管理者モードで起動して、次のコマンドを実行するとインストールできます。

winget install -e --id Git.Git
wsl --install

Windows でのインストール方法についての詳細は次の記事を参考にしてください。

また、次の Docker のソフトウェアも必要です。

ただし、WSL Ubuntu をインストールしてあれば、開発コンテナを使うときに自動で Docker in WSL がインストールされます。

Docker in WSLWSL Ubuntu へ Docker の公式リポジトリを登録して、docker-ce パッケージ等をインストールするものです。

これで良い場合は自分でインストールする必要はありません。

個人なら Windows 環境で Docker を使いたい場合は Docker Desktop をインストールしても良いです。個人使用でない場合、Docker Desktop の使用にあたって商用ライセンスが必要となる場合があるのでライセンスページの https://docs.docker.com/subscription/desktop-license/ を確認してください。

Windows で Docker Desktop をインストールするには、PowerShell を管理者モードで起動して、次のコマンドを実行するとインストールできます。

winget install -e --id Docker.DockerDesktop

開発コンテナーのセットアップ

それでは開発コンテナーのセットアップをしてみましょう。

  1. PC 上にプロジェクト用のフォルダ(例: dvc-java)を作成します。
  2. VS Code でそのフォルダを開きます。
  3. VS Code のコマンドパレット (Ctrl+Shift+P) から Dev Containers: Add Dev Container Configuration Files... を実行します。
  4. Java devcontainers を選択します。
  5. 21-bullseye を選択します。
  6. 後はデフォルトのまま、0 個選択済み のままで「OK」をクリックし続けます。

/images/20250910_vscode_java/01.png
開発コンテナー構成ファイルを追加する時の画面

/images/20250910_vscode_java/02.png
Java devcontainers を指定するときの画面

/images/20250910_vscode_java/03.png
21-bullseye を指定するときの画面

/images/20250910_vscode_java/04.png
Java開発コンテナーのオプションで選択0個の画面

/images/20250910_vscode_java/05.png
インストールする追加機能で選択0個の画面

/images/20250910_vscode_java/06.png
オプションのファイル/ディレクトリで選択0個の画面

これで、.devcontainer/devcontainer.json ファイルが作成されて、Java 用の開発コンテナが使えるようになります。

{
  "name": "Java",
  "image": "mcr.microsoft.com/devcontainers/java:1-21-bullseye",

  "features": {
    "ghcr.io/devcontainers/features/java:1": {
      "version": "none",
      "installMaven": "false",
      "installGradle": "false"
    }
  }
}

これをそのまま使っても良いのですが、筆者の場合はカスタマイズした開発コンテナを https://github.com/hiro345g/dvc で用意してあります。ここでは、その中にある hiro345g/dvc:jdk-202507"image": に指定して使うことにします。

また、開発でよく使われる VS Code の拡張機能も使えるようにするため、devcontainer.jsoncustomizations.vscode.extensions へ次のものを指定します。

拡張機能 拡張機能 ID 説明
Extension Pack for Java vscjava.vscode-java-pack Java 開発用
Container Tools ms-azuretools.vscode-containers Docker コンテナ管理用
Docker DX docker.docker Docker 開発用
GitLens eamodio.gitlens Git 操作用
Git History donjayamanne.githistory Git 履歴表示用
Git Graph mhutchie.git-graph Git グラフ表示用

以上の内容を反映するために、.devcontainer/devcontainer.json を次のように書き換えます。

.devcontainer/devcontainer.json
// For format details, see https://aka.ms/devcontainer.json. For config options, see the
// README at: https://github.com/devcontainers/templates/tree/main/src/java
{
  "name": "Java",
  "image": "hiro345g/dvc:jdk-202507",
  "customizations": {
    "vscode": {
      "extensions": [
        "vscjava.vscode-java-pack",
        "ms-azuretools.vscode-containers",
        "docker.docker",
        "eamodio.gitlens",
        "donjayamanne.githistory",
        "mhutchie.git-graph"
      ]
    }
  }
}

使用するイメージはサイズが大きいので、コンテナ起動前にあらかじめ docker image pull コマンドで、ローカルマシンに Docker イメージをキャッシュしておきます。

docker image pull hiro345g/dvc:jdk-202507

準備ができたら、開発コンテナを起動するために、dvc-java 用の VS Code の画面で VS Code の左下のマークをクリックして表示されるメニューから「コンテナーで再度開く」を実行します。コマンドパレットを開いて、Dev Containers: Reopen in Container を実行しても良いです。

/images/20250910_vscode_java/07.png
コンテナーで再度開く時の画面

これにより、Java 開発に必要な環境が整った開発コンテナが起動し、VS Code が再起動します。それから、この開発コンテナにアタッチした VS Code の画面が表示されます。

/images/20250910_vscode_java/08.png
開発コンテナにアタッチした VS Code の画面

VS Code の画面の左下を見ると、開発コンテナにアタッチしていることがわかる表示となっています。

このとき、devcontainer.json で指定した Extension Pack for Javavscjava.vscode-java-pack)なども自動でインストールされます。

開発コンテナが起動したら、拡張機能の画面を表示して Extension Pack for Java が有効化されていることを確認します。もし無効化されていたら、有効化するために、Extension Pack for Java 拡張機能の欄にある歯車のアイコンをマウスクリックしてコンテキストメニューを表示します。それから、メニューにある「有効にする(ワークスペース)」をクリックします。

/images/20250910_vscode_java/09.png
拡張機能を有効にする時の画面

VS Code での Java プロジェクト管理

VS Code で Java プロジェクトの管理について理解するには、Extension Pack for Java 拡張機能に含まれる Project Manager for Java 拡張機能(vscjava.vscode-java-dependency)から使い始めるのが良いです。単純な Java のサンプルコードを動かしたい場合は、MavenGradle といったビルドツールを使ったプロジェクト管理は大袈裟です。

そのため、ここでは、MavenGradle といったビルドツールを使わない、最も基本的な Java プロジェクトを作成して使ってみることにします。

このとき、Java のプロジェクト画面を表示させることができなくて困ることがあります。よくあるパターンは次のものです。

  • A: 開いているフォルダが Java プロジェクトだと認識されていない
  • B: セカンダリー サイド バーに表示される設定となっている

A については、Java のソースファイルを開くと Java プロジェクトと認識されます。

B については、VS Code のメニューからセカンダリ サイド バーを表示することで解決できます。具体的には、「表示」-「外観」-「セカンダリ サイド バー」をクリックします。

Java のプロジェクト画面が表示できないときは、慌てずに、これらについて確認するようにしてください。

プロジェクトの作成

次の手順で Java プロジェクトを作成します。

  1. コマンドパレット (Ctrl+Shift+P) を開き、Java: Create Java Project... を選択します。
  2. No build tools を選択します。
  3. プロジェクトの場所として /workspaces/dvc-java を選択します。
  4. プロジェクト名(例: java-app001)を入力して Enter を入力します。

このときの画面は次のようになります。

/images/20250910_vscode_java/10.png
Java: Create Java Project...の画面

/images/20250910_vscode_java/11.png
No build tools を選択する画面

このとき、次の通知が表示される場合があります。統計データを収集する Red Hat に協力する場合は「Accept」をクリックします。拒否する場合は「Deny」をクリックします。

/images/20250910_vscode_java/12.png
統計データを収集する Red Hat に協力するか選択する通知

/images/20250910_vscode_java/13.png
Select the project location を指定する画面

/images/20250910_vscode_java/14.png
Input a Java project name を指定する画面

すると、java-app001 という名前のフォルダが次のようなフォルダ構成で作成され、src フォルダにプログラム App.java が作成されます。

java-app001/
├── README.md
├── lib/
└── src/
    └── App.java

また、java-app001 を開いた VS Code 画面が新規に表示されます。

Java プロジェクトの画面構成

Java プロジェクトでは、VS Code のエクスプローラーに「JAVA PROJECTS」という専用のビューが追加されます。java-app001 を開いた VS Code の画面で src/App.java を開くと次のようになります。

/images/20250910_vscode_java/15.png
JAVA PROJECTSのビューが表示された時の画面

この専用ビューは Java 開発に特化したプロジェクト管理機能で、主に以下の要素で構成されています。

  • プロジェクト名 (例: java-app001):
    • src: ソースコード (.java ファイル) が格納されるフォルダです。App.javaAppTest.java はここに置きます。
    • JRE System Library [JavaSE-21]: 実行時に使用する Java Runtime の情報が表示されます。
    • Referenced Libraries: プロジェクトが参照するライブラリ (JAR ファイル) の一覧です。JUnit や SLF4J などを追加すると、ここに表示されます。ライブラリの追加・削除もこのビューから行えます。
    • bin: コンパイル後のクラスファイル (.class ファイル) が出力されるフォルダです。作成後に表示されます。通常は直接編集することはありません。

このビューを使うことで、ライブラリの管理やソースコードの構造を直感的に把握できます。

コーディングと実行

それでは、開いてある src/App.java のコードを編集して実行してみましょう。

src/App.java
/**
 * メインクラス
 */
public class App {
    /**
     * プログラムのエントリーポイント。
     * "Hello, World from VS Code!" というメッセージを標準出力に出力します。
     * @param args コマンドライン引数(未使用)
     * @throws Exception 例外が発生した場合
     */
    public static void main(String[] args) throws Exception {
        System.out.println("Hello, World from VS Code!");
    }
}

main メソッドの上にある Run をクリックするか、F5 キーを押すとプログラムが実行されます。

/images/20250910_vscode_java/16.png
プログラムを実行する時の画面

プログラムを実行すると、ターミナルに "Hello, World from VS Code!" と表示されます。

node ➜ /workspaces/dvc-java/java-app001 $  /usr/bin/env /usr/local/sdkman/candidates/java/21.0.7-tem/bin/java -XX:+ShowCodeDetailsInExceptionMessages -cp /workspaces/dvc-java/java-app001/bin App
Hello, World from VS Code!

デバッグ

コードの動きをステップごとに追うデバッグ機能を試します。

  1. System.out.println の行の左側をクリックして、赤い丸(ブレークポイント)を設置します。
  2. main メソッドの上にある Debug をクリックするか、F5 キーを押します。
  3. プログラムがブレークポイントで一時停止し、画面左の「実行とデバッグ」ビューで変数の中身を確認したり、画面上部に表示されるツールバーのアイコンを使ってステップ実行(ステップオーバー/イン/アウト)したりできます。

/images/20250910_vscode_java/17.png
ブレークポイントを指定してデバッグ実行する時の画面

/images/20250910_vscode_java/18.png
プログラムがブレークポイントで一時停止した画面

テスト

作成したプログラムの動作確認をするには自動テストができるようにしておくことが重要です。ここでは自動テストができるようにしましょう。

テスト用ライブラリの準備をしてから、テストコードを作成して、テスト実行をしてみます。その際、意味のある単体テストを作成するために、App.java のコードを少し変更(リファクタリング)します。

現在のコードでは、main メソッドが表示メッセージの作成と出力を両方行っており、このままではテストが困難です。そこで、メッセージを生成するロジックを独立したメソッドに切り出し、そのメソッドをテストの対象とします。

テスト用ライブラリの準備

テストを作成する前に、テスト用ライブラリの準備をします。クラスパスにライブラリ用の JAR ファイルを設定する必要があります。

エクスプローラーの「JAVA PROJECTS」ビューにある「Referenced Libraries」にライブラリ用の JAR ファイルが表示されるようにします。

まず、次のライブラリを Maven Central Repository からダウンロードします。Maven Central Repository は Java 用のライブラリを公開しているサイトです。

次の画面は、VS Code をアタッチした開発コンテナのターミナルを使って作業をするときのものになります。

/images/20250910_vscode_java/19.png
ターミナルでテスト用ライブラリの準備をするときの画面

VS Code のメニューで「ターミナル」-「新しいターミナル」をクリックすると、VS Code の画面右下側にターミナルのパネルが表示されます。そこで、次の curl コマンドを使って、必要なファイルを入手することができます。

curl -L -O https://repo1.maven.org/maven2/junit/junit/4.13.2/junit-4.13.2.jar
curl -L -O https://repo1.maven.org/maven2/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar

入手したファイルはプロジェクトフォルダ内の lib フォルダに置きます。ファイルの移動には mv コマンドを使います。

mv junit-4.13.2.jar lib/
mv hamcrest-core-1.3.jar lib/

これで Java プロジェクトの画面でライブラリ(Referenced Libraries)に junit と hamcrest-core の JAR ファイルが追加されます。

ファイル移動後に、VS Code に反映されない場合は、次の図のように「エクスプローラー」の画面にある「JAVA-APP001」のあたりにマウスポインタを近づけると「エクスプローラーを最新表示する」というメッセージを表示するアイコンがあるので、これをクリックします。すると、ファイルの移動が反映されます。

/images/20250910_vscode_java/20.png
ターミナルでテスト用ライブラリの準備をするときの画面

「Referenced Libraries」の表示についても、マウスポインタを近づけると「Refresh」というメッセージを表示するアイコンをクリックすることで、反映されます。

なお、JAR ファイルを別のパスに置きたい場合は、手動で設定が必要です。そのときの手順は次のようになります。

  1. VS Code のエクスプローラーで「JAVA PROJECTS」ビューを開きます。
  2. java-app001 プロジェクト内の Referenced Libraries にカーソルを合わせると表示される + アイコンをクリックします。
  3. 使用する JAR ファイルのパスを選択し、「Select Jar Libraries」をクリックします。

App クラスへメソッド追加

ここでは、src/App.java を変更し、挨拶メッセージを返す getGreeting() メソッドを追加することにします。メソッドの仕様としては次のような型を満たすとします。

/**
 * 挨拶用の固定メッセージ "Hello, World from VS Code!" を返却します。
 *
 * @return 固定メッセージ
 */
String getGreeting();

テストコードの作成

まず、この getGreeting() メソッドをテストするコードを記述します。src フォルダを右クリックし表示されるメニューにある「新しいファイル」をクリックします。エクスプローラー内で新しいファイル名を入力する欄が表示されるので、AppTest.java と入力して、このファイルを作成します。

/images/20250910_vscode_java/21.png
src/AppTest.java 作成時の画面

src/AppTest.java には次のテストコードを記述します。getGreeting() メソッドが期待通りの文字列を返すかを assertEquals を使って検証します。

src/AppTest.java
import static org.junit.Assert.assertEquals;
import org.junit.Test;

/**
 * App クラスのテストクラス
 */
public class AppTest {
    /**
     * getGreeting メソッドのテスト。
     * 戻り値が期待通りのメッセージであることを検証します。
     */
    @Test
    public void testGetGreeting() {
        // App.getGreeting()を呼び出し、戻り値が期待通りか検証
        assertEquals("Hello, World from VS Code!", App.getGreeting());
    }
}

テスト用のライブラリが正しくプロジェクトへ追加されていると、testGetGreeting メソッドやクラス定義の左側に実行用のアイコンボタンが表示されます。

/images/20250910_vscode_java/22.png
テスト実行時の画面

ここでテスト実行をクリックすると、ここでは、App クラスには、まだ getGreeting() メソッドは実装されていないため、ビルドが失敗します。ビルドが失敗すると、テスト実行を続けるかどうかの通知が VS Code の画面右下側に表示されます。

続けると当然テストが失敗して、画面左の「テスト」ビューの結果に赤いマークがつきます。

/images/20250910_vscode_java/23.png
テスト失敗時の画面

もしテストが実行されて成功した場合は、画面左の「テスト」ビューの結果に緑のチェックマークが付きます。

テストが通るようにコード修正

次に、テストが通るように src/App.java を変更します。App クラスに getGreeting() メソッドを追加しています。

src/App.java
/**
 * メインクラス
 */
public class App {
    /**
     * 挨拶用の固定メッセージを返します。
     * @return "Hello, World from VS Code!" という文字列
     */
    public static String getGreeting() {
        return "Hello, World from VS Code!";
    }

    /**
     * プログラムのエントリーポイント。
     * getGreeting() メソッドで取得したメッセージを標準出力に出力します。
     * @param args コマンドライン引数(未使用)
     * @throws Exception 例外が発生した場合
     */
    public static void main(String[] args) throws Exception {
        System.out.println(getGreeting());
    }
}

テストが成功することを確認

src/App.java を修正したら、src/AppTest.java のテストを実行します。今度は用意してあるテストがグリーンとなるはずです。

/images/20250910_vscode_java/24.png
テスト成功時の画面

これにより、getGreeting() メソッドが正しく動作していることが保証されます。

応用: ログ出力ライブラリの導入

次に、より実践的なアプリケーション開発で必須となる「ログ出力」を試してみましょう。ここでは、広く使われているロギングライブラリである SLF4J を手動でプロジェクトに追加し、利用する手順を解説します。

ログ出力用ライブラリのダウンロード

Maven Central Repository から必要なライブラリ(JAR ファイル)をダウンロードします。

curl コマンドを使って入手する場合は次のようにします。

curl -L -O https://repo1.maven.org/maven2/org/slf4j/slf4j-api/2.0.17/slf4j-api-2.0.17.jar
curl -L -O https://repo1.maven.org/maven2/org/slf4j/slf4j-simple/2.0.17/slf4j-simple-2.0.17.jar

ダウンロードした 2 つの JAR ファイルを、java-app001/lib フォルダへ移動します。

mv slf4j-api-2.0.17.jar lib/
mv slf4j-simple-2.0.17.jar lib/

これで Java プロジェクトの画面でライブラリ(Referenced Libraries)に slf4j-api と slf4j-simple の JAR ファイルが追加され、プロジェクトで SLF4J の機能が使えるようになります。

ログ出力コードの記述

src/App.java を、テストの節で作成した getGreeting() メソッドにログ出力処理を追加する形で、以下のように書き換えます。ロジックの実行とログ記録を同じメソッド内で行います。

src/App.java
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * メインクラス
 */
public class App {
    /** ロガー */
    private static final Logger logger = LoggerFactory.getLogger(App.class);

    /**
     * 挨拶用の固定メッセージを返し、その過程でログを出力します。
     * @return "Hello, World from VS Code!" という文字列
     */
    public static String getGreeting() {
        logger.info("This is an info message.");
        logger.warn("This is a warning message.");
        logger.error("This is an error message.");
        return "Hello, World from VS Code!";
    }

    /**
     * プログラムのエントリーポイント。
     * getGreeting() メソッドで取得したメッセージを標準出力に出力します。
     * @param args コマンドライン引数(未使用)
     * @throws Exception 例外が発生した場合
     */
    public static void main(String[] args) throws Exception {
        System.out.println(getGreeting());
    }
}

F5 キーを入力するなどして、src/App.java のプログラムを実行すると、ターミナルに指定したログと、getGreeting() が返した Hello, World from VS Code! というメッセージの両方が出力されるはずです。

node ➜ /workspaces/dvc-java/java-app001 $  /usr/bin/env /usr/local/sdkman/candidates/java/21.0.7-tem/bin/java @/tmp/cp_3abpth1v0yse1o3qj01g78dhc.argfile App
[main] INFO App - This is an info message.
[main] WARN App - This is a warning message.
[main] ERROR App - This is an error message.
Hello, World from VS Code!

ビルドと実行のスクリプト化

毎回 VS Code の実行ボタンを押す代わりに、コマンドラインからビルド、テスト実行、プログラム実行ができるようにスクリプトを用意しておくと便利です。java-app001 フォルダに script フォルダを用意して、これから紹介する 3 つのファイルを作成します。

ターミナルでフォルダを作るには mkdir コマンドを使います。今回使っている開発コンテナの場合は、カレントフォルダを /workspace/java-app001 として次のようにします。

cd /workspace/java-app001
mkdir script

ビルドスクリプト (build.sh)

Java のソースコードをコンパイルして java-app001/bin フォルダにクラスファイルを生成します。

build.sh
#!/bin/bash
SCRIPT_DIRNAME=$(dirname "$0")
PROJECT_DIR=$(cd "${SCRIPT_DIRNAME}/.." || exit 1;pwd)

# bin, lib フォルダがなければ作成
if [ ! -e "${PROJECT_DIR}/bin" ]; then mkdir -p "${PROJECT_DIR}/bin"; fi
if [ ! -e "${PROJECT_DIR}/lib" ]; then mkdir -p "${PROJECT_DIR}/lib"; fi

# 必要なライブラリを確認し、なければダウンロード
if [ ! -e "${PROJECT_DIR}/lib/slf4j-api-2.0.17.jar" ]; then
  curl -L -O https://repo1.maven.org/maven2/org/slf4j/slf4j-api/2.0.17/slf4j-api-2.0.17.jar
  mv slf4j-api-2.0.17.jar "${PROJECT_DIR}/lib/slf4j-api-2.0.17.jar"
fi
if [ ! -e "${PROJECT_DIR}/lib/slf4j-simple-2.0.17.jar" ]; then
  curl -L -O https://repo1.maven.org/maven2/org/slf4j/slf4j-simple/2.0.17/slf4j-simple-2.0.17.jar
  mv slf4j-simple-2.0.17.jar "${PROJECT_DIR}/lib/slf4j-simple-2.0.17.jar"
fi

# コンパイル
javac -d "${PROJECT_DIR}/bin" -cp "${PROJECT_DIR}/lib/*:${PROJECT_DIR}/src" "${PROJECT_DIR}/src/App.java"

echo "Build successful!"

テストスクリプト (test.sh)

src/AppTest.java のテストを実行します。

test.sh
#!/bin/bash
SCRIPT_DIRNAME=$(dirname "$0")
PROJECT_DIR=$(cd "${SCRIPT_DIRNAME}/.." || exit 1;pwd)

# bin, lib フォルダがなければ作成
if [ ! -e "${PROJECT_DIR}/bin" ]; then mkdir -p "${PROJECT_DIR}/bin"; fi
if [ ! -e "${PROJECT_DIR}/lib" ]; then mkdir -p "${PROJECT_DIR}/lib"; fi

# 必要なライブラリを確認し、なければダウンロード
if [ ! -e "${PROJECT_DIR}/lib/junit-4.13.2.jar" ]; then
  curl -L -O https://repo1.maven.org/maven2/junit/junit/4.13.2/junit-4.13.2.jar
  mv junit-4.13.2.jar "${PROJECT_DIR}/lib/junit-4.13.2.jar"
fi
if [ ! -e "${PROJECT_DIR}/lib/hamcrest-core-1.3.jar" ]; then
  curl -L -O https://repo1.maven.org/maven2/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar
  mv hamcrest-core-1.3.jar "${PROJECT_DIR}/lib/hamcrest-core-1.3.jar"
fi

# コンパイル
javac -d "${PROJECT_DIR}/bin" -cp "${PROJECT_DIR}/lib/*:${PROJECT_DIR}/src" "${PROJECT_DIR}/src/AppTest.java"

# テスト実行
java -cp "${PROJECT_DIR}/lib/*:${PROJECT_DIR}/bin" org.junit.runner.JUnitCore AppTest

実行スクリプト (run.sh)

コンパイルされたクラスファイルを実行します。

run.sh
#!/bin/bash
SCRIPT_DIRNAME=$(dirname "$0")
PROJECT_DIR=$(cd "${SCRIPT_DIRNAME}/.." || exit 1;pwd)

# ビルド時とテスト実行時に必要な準備はしてあるため、ここでは実行するのみ
java -cp "${PROJECT_DIR}/lib/*:${PROJECT_DIR}/bin" App

実行

これらのファイルに実行権限を与えます。

chmod +x script/*.sh

ターミナルからビルドを実行してクラスファイルを生成します。

./script/build.sh

ビルドが成功したら、テスト実行します。

./script/test.sh

テスト実行が成功したら、プログラムを実行します。

./script/run.sh

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

node ➜ /workspaces/dvc-java/java-app001 $ ./script/build.sh
Build successful!
node ➜ /workspaces/dvc-java/java-app001 $ ./script/test.sh
JUnit version 4.13.2
.[main] INFO App - This is an info message.
[main] WARN App - This is a warning message.
[main] ERROR App - This is an error message.

Time: 0.017

OK (1 test)
node ➜ /workspaces/dvc-java/java-app001 $ ./script/run.sh
[main] INFO App - This is an info message.
[main] WARN App - This is a warning message.
[main] ERROR App - This is an error message.
Hello, World from VS Code!

ワークスペースと設定の活用

複数のプロジェクトを管理したり、プロジェクト固有の設定を共有したりするために、VS Code の「ワークスペース」機能が役立ちます。また、Java 開発をより快適にするための設定も見ていきましょう。

設定ファイル .vscode/settings.json

java-app001 フォルダ作成時に、設定ファイル .vscode/settings.json が自動で作成されています。このファイルの内容は次のようになっています。

{
  "java.project.sourcePaths": ["src"],
  "java.project.outputPath": "bin",
  "java.project.referencedLibraries": ["lib/**/*.jar"]
}

このファイルを編集することで、プロジェクトの設定をカスタマイズすることができます。

設定画面 (Settings)

VS Code の設定は、UI から変更することもできます。

  • Ctrl+, (カンマ) を押すか、VS Code のメニューで「ファイル」-「ユーザー設定」-「設定」から設定画面を開きます。
  • 検索ボックスに java と入力すると、Java 関連の設定項目を一覧で確認・変更できます。

例えば、フォーマットの設定や、Java のバージョン、デバッグ時の設定などが細かく調整可能です。

なお、UI で行った設定は、settings.json というファイルに保存されます。設定画面のタブ毎に別のパスにある settings.json ファイルが用意されています。対応する settings.json を直接編集することで、設定することもできます。

ワークスペースごとに設定を分けたい場合は、.code-workspace ファイル内の settings ブロックに記述することで、そのワークスペースを開いているときだけ有効な設定を定義できます。これにより、プロジェクトの規約などをチームで共有しやすくなります。

ワークスペースファイルの作成 (.code-workspace)

ワークスペース固有の設定は、.code-workspace ファイルを作成して保存しておくとカスタマイズや共有がしやすくなります。ここではワークスペースファイルを用意して、Java 開発に便利な設定を追加してみましょう。

java-app001 フォルダ直下に次の内容のファイルを java-app001.code-workspace という名前で作成します。

java-app001.code-workspace
{
  "folders": [
    {
      "path": "."
    }
  ]
}

このファイルを VS Code のエディタ画面で開くと「ワークスペースを開く」というボタンが表示されます。

/images/20250910_vscode_java/25.png
「ワークスペースを開く」ボタンが表示された画面

ワークスペースを使う場合は、このボタンをクリックするか、VS Code のメニューから「ファイル」-「ファイルでワークスペースを開く」をクリックして、ワークスペース用のファイルを開きます。

ここでは、まだワークスペースは開かずにファイルの編集を続けます。

以下に、Java 開発でよく使われる設定のサンプルを示します。コメントに簡単ですが説明をしてあります。

java-app001.code-workspace
{
  // ワークスペースに含めるフォルダを指定
  "folders": [
    {
      "path": "."
    }
  ],
  // ワークスペース全体に適用する設定
  "settings": {
    // Javaのバージョン設定
    // Dev Container を使っている場合は不要なことが多いですが、明示的に指定する例です
    "java.configuration.runtimes": [
      {
        "name": "JavaSE-21",
        "path": "/usr/local/sdkman/candidates/java/21.0.7-tem", // Dev Container内のJDKパス
        "default": true
      }
    ],
    // ファイル保存時に自動でフォーマットする
    "editor.formatOnSave": true,
    // .vscode/settings.json にあった設定の反映。
    // こちらを使う場合、`.vscode/setting.json` は削除して良い。
    "java.project.sourcePaths": [
      "src"
    ],
    "java.project.outputPath": "bin",
    "java.project.referencedLibraries": [
      // 参照ライブラリのパスを指定 (globパターンが使えます)
      "lib/**/*.jar"
    ],
    // Lombok などの Java エージェントを使う場合の設定例(必要ならコメント解除)
    // "java.jdt.ls.vmargs": "-noverify -Xmx1G -jar /path/to/lombok.jar -Djava.awt.headless=true",
    // エクスプローラーから直接操作することのないファイル/フォルダを非表示
    "files.exclude": {
      "**/.git": true,
      "**/.svn": true,
      "**/.hg": true,
      "**/CVS": true,
      "**/.DS_Store": true,
      "**/Thumbs.db": true,
      "**/bin": true, // コンパイル後のクラスファイル
      "**/.settings": true, // Eclipse 固有の設定ファイル
      "**/.classpath": true,
      "**/.project": true
    }
  },
  // ワークスペースで推奨する拡張機能
  "extensions": {
    "recommendations": [
      "vscjava.vscode-java-pack",
      "ms-azuretools.vscode-containers",
      "docker.docker",
      "eamodio.gitlens",
      "donjayamanne.githistory",
      "mhutchie.git-graph"
    ]
  }
}

このワークスペースファイルを開いて開発を進めることで、チーム内で設定を統一したり、個人の開発効率を向上させたりすることができます。

編集ができたら、ワークスペースを開いてみましょう。「エクスプローラー」のフォルダ名が表示されていた部分が少し変わってワークスペースの表示になります。

開発コンテナの終了

開発作業が終了したら、開発コンテナを終了します。

今回使用した開発コンテナは WSL Ubuntu の Docker で起動しています。VS Code を終了させてから、WSL Ubuntu のコンソールを使って終了します。

docker container ls コマンドでコンテナの一覧が表示されます。ここで、イメージ名が vsc-dvc-java で始まるものが、今回使用した開発コンテナになります。実行例は次のようになります。

$ docker container ls -a
CONTAINER ID   IMAGE (略)                     NAMES
1163c3280882   vsc-dvc-java-9f(略)-uid (略) stupefied_mclean

docker container stop コマンドで停止します。

$ docker container stop  stupefied_mclean
stupefied_mclean

開発を再開する場合は、VS Code から「コンテナーで再度開く」を実行します。もし、停止したものが使われず、新しい開発コンテナが起動してしまう場合は、この後説明する方法で開発コンテナを終了してください。

開発コンテナを終了したい場合は docker container rm コマンドを実行します。実行例は次のようになります。

$ docker container rm stupefied_mclean
stupefied_mclean

まとめ

本記事では、VS Code と Dev Containers を使い、ビルドツールに頼らないシンプルな Java 開発フローを一通り解説しました。環境構築から始まり、プロジェクト作成、コーディング、デバッグ、テスト、さらに応用として外部ライブラリの導入とスクリプトによる自動化、そしてワークスペースの活用まで、基本的ながらも実践的な内容を網羅しました。

こういった基本をマスターしておけば、複雑なフレームワークやライブラリを使った開発でトラブルにあったときの問題解決に役立ちます。たとえば、使用したいライブラリーが意図した通りに動かない場合に、複雑なフレームワークの構成の中で動かすのではなく、こういった基本的な構成のプロジェクトで動作確認することができるようになります。

Discussion