VS Code + GitHub Copilot + Java で開発環境がぶつかるポイントと回避策
はじめに
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 の状態とアクティブなターミナルを確認するのが近道です。