はじめに
Visual Studio Code (VS Code) で Java 開発をしている際、システムには新しいバージョンの JDK (例: JDK 21) をインストールし、ターミナルでは java --version
で正しく認識されているのに、VS Code 上(特にステータスバー)では古いバージョン (例: JDK 14) が表示され続ける、という現象に遭遇して詰まったため、備忘メモを兼ねて残したいと思います。
環境
- OS: macOS
- インストール済み JDK: 14, 21
- プロジェクト管理: Maven
遭遇した問題
- ターミナルでは
java --version
が21
を示す。 - VS Code の右下ステータスバーには
JDK 14
と表示される。 - VS Code の設定 (
settings.json
) で JDK 21 を指定しても、ステータスバーの表示が変わらない。 - JDK 16 以降で使える
record
を使うと、エディタ上に...'record' is not a valid type name... in Java 14
のような警告が表示される。
試したこと
1. VS Code の実行ランタイム設定 (settings.json
)
まず、VS Code が Java Language Server やコード実行/デバッグに使用する JDK を指定する設定を確認・変更しました。
1-1. JDK 21 のパスを確認
ターミナルで以下のコマンドを実行し、JDK 21 のインストールパスを取得します。
/usr/libexec/java_home -v 21
# 出力例: /Library/Java/JavaVirtualMachines/jdk-21.jdk/Contents/Home
1-2. VS Code ユーザー設定 (settings.json
) の編集
コマンドパレット (Cmd + Shift + P
) から Preferences: Open User Settings (JSON)
を選択し、settings.json
を開きます。
java.configuration.runtimes
を以下のように設定(または追記)しました。
{
// ... 他の設定 ...
"java.configuration.runtimes": [
{
"name": "JavaSE-21",
"path": "/Library/Java/JavaVirtualMachines/jdk-21.jdk/Contents/Home", // 手順1-1で確認したパス
"default": true // これをデフォルトとして使用
}
// 他のJDKがあればここに追加可能
]
// ... 他の設定 ...
}
ファイルを保存し、VS Code を再読み込み (Developer: Reload Window
) または再起動しました。
結果: ステータスバーの表示は JDK 14
のままでした。
2. 設定の確認と切り分け
設定が反映されない原因を探りました。
-
ワークスペース設定の確認: プロジェクトフォルダ直下の
.vscode/settings.json
に Java バージョンを上書きする設定がないか確認しました。今回は存在しませんでした。 -
Java: Configure Java Runtime
コマンド: コマンドパレットからこのコマンドを実行すると、「JDK For Language Server」として JavaSE-21 が正しく認識・設定されていることが確認できました。
結果: VS Code の Java 拡張機能自体は、設定を読み込み JDK 21 を認識しているようでした。しかしステータスバー表示は依然として JDK 14
でした。
3. キャッシュクリアと再起動
Java Language Server のキャッシュが影響している可能性を考え、クリーンアップを試しました。
- コマンドパレットから
Java: Clean Java Language Server Workspace
を実行。 - VS Code を完全に終了 (
Cmd + Q
) してから再起動。
結果: これでもステータスバーの表示は JDK 14
のままでした。
4. 実際の実行バージョンの確認
ステータスバー表示は正しくないものの、実際にコードを実行する際に使われる JDK バージョンを確認しました。
以下のコードを実行しました。
public class Test {
public static void main(String[] args) {
System.out.println("Running with Java version: " + System.getProperty("java.version"));
System.out.println("Using JDK located at: " + System.getProperty("java.home"));
}
}
VS Code 上で Run Java
を実行した結果:
Running with Java version: 21.0.6
Using JDK located at: /Library/Java/JavaVirtualMachines/jdk-21.jdk/Contents/Home
結果: コードの 実行 に関しては、意図通り JDK 21 が使われていることが確定しました。
問題はステータスバーの表示が14になってしまう状態が続いていることでした。
5. 言語レベルの問題特定
JDK 21 の機能である record
を使って確認しようと思い、以下のコードを実行しました。
public record Point(int x, int y) {}
すると、エディタ上に以下の警告が表示されました。
'record' is not a valid type name; it is a restricted identifier and not allowed as a type identifier in Java 14 Java(16778958)
発見: この警告は、エディタ上でのリアルタイムなコード解析(静的解析)が Java 14 のルール で行われていることを示していました。実行は JDK 21 で行われるのに対し、コード解析は Java 14 という齟齬が発生していたのです。
6. プロジェクトの言語レベル設定(pom.xml
/ build.gradle
)
Java Language Server は、コード解析を行う際にプロジェクトがどの Java バージョン向けに書かれているか(ソース/ターゲット互換レベル)を参照します。
この情報は通常、Maven や Gradle などのビルドツールの設定ファイルに記述されています。
今回は Maven プロジェクトだったので、pom.xml
を確認しました。
<properties>
<maven.compiler.source>14</maven.compiler.source>
<maven.compiler.target>14</maven.compiler.target>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>14</source>
<target>14</target>
</configuration>
</plugin>
</plugins>
</build>
これを Java 21 に修正しました。
<properties>
<maven.compiler.release>21</maven.compiler.release>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<release>21</release>
</configuration>
</plugin>
</plugins>
</build>
pom.xml
を保存した後、VS Code にプロジェクト設定を再読み込みさせるため、コマンドパレットから Java: Update project configuration
を実行しました。
結果:
-
record
に関する警告が消えました。コード解析が Java 21 のルールで行われるようになりました。 - ついに、右下のステータスバー表示も、
JDK 21
と表示されるようになりました!
まとめ
VS Code で Java のバージョンに関する問題が発生した場合、以下の設定を見直してみましょう。
-
VS Code 設定 (
settings.json
のjava.configuration.runtimes
):- Java Language Server 自体の実行 JDK
- コード実行・デバッグ時のデフォルト JDK
-
Java: Configure Java Runtime
コマンドで確認・設定可能
-
プロジェクトのビルド設定 (
pom.xml
,build.gradle
):- プロジェクトのソース/ターゲット互換レベル (Java 言語レベル)
- Java Language Server がコード解析ルールを決定するために参照
- 今回のケースでは、これがステータスバー表示にも最終的に影響していた
単に VS Code の設定を変更するだけでなく、プロジェクト自身のビルド設定(pom.xml
や build.gradle
)で Java のバージョン(言語レベル)が正しく指定されているかを確認することが、特にコード解析の警告やステータスバー表示の問題解決には重要でした。
同様の問題に遭遇した方の助けになれば幸いです。