Tech Blog

VS Code + GitHub Copilot + Java で開発環境がぶつかるポイントと回避策

VS Code GitHub Copilot Java Spring Boot

はじめに

VS Code で Java 開発をするとき、複数の拡張機能が同時に動くため、
思わぬ場所で干渉・競合が発生することがあります。

特に以下の組み合わせでは注意が必要でした:

  • Language Support for Java (Red Hat製)
  • GitHub Copilot / GitHub Copilot Chat
  • Spring Boot Extension Pack
  • Maven Wrapper + プロジェクト内Node構成

この記事は、実際に遭遇したトラブルと回避策の記録です。


① run_in_terminal が jshell に吸われる問題

症状

VS Code のターミナルでコマンドを実行しようとすると、
jshell(Java の REPL)が起動しているセッションに誤って入力が流れる。

原因

Language Support for Java の拡張機能が起動時に jshell セッションを開くことがあり、
それがアクティブなターミナルと競合します。

回避策

VS Code のタスク(tasks.json)経由でコマンドを実行する。

// .vscode/tasks.json
{
  "tasks": [
    {
      "label": "build-skip-tests",
      "type": "shell",
      "command": ".\\mvnw.cmd",
      "args": ["-DskipTests", "package"],
      "options": {
        "cwd": "${workspaceFolder}"
      }
    }
  ]
}

タスクは独立したシェルで実行されるため、jshell の干渉を受けません。


② Java Language Server が古いJDKを掴む

症状

pom.xml で Java 21 を指定しているのに、
コードのエラーが Java 11 のルールで表示される。

原因

VS Code の Java Language Server が使用する JDK と、
プロジェクトのコンパイルターゲットが一致していない。

確認方法

コマンドパレット(Ctrl+Shift+P)→ Java: Configure Java Runtime

「Project JDK」が正しいバージョンになっているか確認

回避策

.vscode/settings.json で JDK を明示指定する。

// .vscode/settings.json
{
  "java.configuration.runtimes": [
    {
      "name": "JavaSE-21",
      "path": "C:\\Program Files\\Java\\jdk-21",
      "default": true
    },
    {
      "name": "JavaSE-25",
      "path": "C:\\Program Files\\Java\\jdk-25"
    }
  ],
  "java.jdt.ls.java.home": "C:\\Program Files\\Java\\jdk-21"
}

③ Copilot Chat の Agentモードがターミナルを占有する

症状

Copilot Agentがコマンドを実行するとき、
既に開いているターミナルのセッションに入力を送ることがある。
jshell が起動していた場合、mvn コマンドが jshell の入力として解釈される。

回避策

  • ターミナルで jshell が起動している場合は :exit で終了する
  • Copilot Agent にコマンド実行を依頼するときは、
    新しいターミナルを開いてからリクエストするか、タスクで実行してもらう

④ Lombok を使う場合のアノテーションプロセッサ設定

症状

@Getter, @Builder などのLombok アノテーションが赤波線になる。
コンパイルは通るのにエラー表示が消えない。

回避策

// .vscode/settings.json
{
  "java.compile.nullAnalysis.mode": "disabled",
  "java.configuration.updateBuildConfiguration": "automatic"
}

また、pom.xml に Lombok の dependency が正しく追加されているか確認:

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <optional>true</optional>
</dependency>

⑤ Spring Boot DevTools + Copilot の自動コンプリートが競合

症状

Spring Boot DevTools によるホットリロードが頻繁に走り、
Copilot の補完が途中でリセットされる。

対応

開発中は DevTools を有効にしつつ、
大規模な補完(クラス生成など)を行うときは一時的にアプリを停止する。

DevTools のリスタートトリガーを絞ることも有効です:

# application-local.yml
spring:
  devtools:
    restart:
      additional-exclude: "**/*.html,**/*.css,**/*.js"

⑥ マルチルートワークスペースでのJava Language Server競合

症状

複数のSpring Boot プロジェクト(admin / customer-app)を同一の VS Code ウィンドウで開くと、
Language Server がそれぞれのプロジェクトを別々に認識せず、
片方のプロジェクトのクラスが見えなかったりする。

原因

Java Language Server の Project ごとの認識に時間がかかることがある。

回避策

.code-workspace ファイルでマルチルートワークスペースを定義する。

// dvd-rental.code-workspace
{
  "folders": [
    {
      "name": "admin",
      "path": "C:\\Users\\y_104\\git\\dvd-rental-admin"
    },
    {
      "name": "customer-app",
      "path": "C:\\Users\\y_104\\git\\dvd-rental-customer-app"
    }
  ],
  "settings": {
    "java.import.maven.enabled": true
  }
}

まとめ

問題回避策
ターミナルが jshell に吸われるtasks.json のタスクでコマンド実行
Language Server が古いJDKを使う.vscode/settings.json で JDK を明示
Copilot のターミナル実行が jshell に流れるjshell を :exit で終了してから依頼
Lombok の赤波線が消えないnullAnalysis.mode: disabled
マルチルートでのProject認識問題.code-workspace ファイルで明示定義

VS Code での Java 開発は拡張機能が充実している反面、
複数の拡張機能が同じリソースを触ることによる干渉が起きやすいです。
「なんか動かない」と感じたら、まず Language Server の状態とアクティブなターミナルを確認するのが近道です。

気軽にメッセージください

技術相談・ご感想・ご質問があればメッセージをお願いします。