1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

VS Codeで古いバージョンのJavaが適用されて詰まった話

Posted at

はじめに

Visual Studio Code (VS Code) で Java 開発をしている際、システムには新しいバージョンの JDK (例: JDK 21) をインストールし、ターミナルでは java --version で正しく認識されているのに、VS Code 上(特にステータスバー)では古いバージョン (例: JDK 14) が表示され続ける、という現象に遭遇して詰まったため、備忘メモを兼ねて残したいと思います。

環境

  • OS: macOS
  • インストール済み JDK: 14, 21
  • プロジェクト管理: Maven

遭遇した問題

  1. ターミナルでは java --version21 を示す。
  2. VS Code の右下ステータスバーには JDK 14 と表示される。
  3. VS Code の設定 (settings.json) で JDK 21 を指定しても、ステータスバーの表示が変わらない。
  4. 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 のバージョンに関する問題が発生した場合、以下の設定を見直してみましょう。

  1. VS Code 設定 (settings.jsonjava.configuration.runtimes):
    • Java Language Server 自体の実行 JDK
    • コード実行・デバッグ時のデフォルト JDK
    • Java: Configure Java Runtime コマンドで確認・設定可能
  2. プロジェクトのビルド設定 (pom.xml, build.gradle):
    • プロジェクトのソース/ターゲット互換レベル (Java 言語レベル)
    • Java Language Server がコード解析ルールを決定するために参照
    • 今回のケースでは、これがステータスバー表示にも最終的に影響していた

単に VS Code の設定を変更するだけでなく、プロジェクト自身のビルド設定(pom.xmlbuild.gradle)で Java のバージョン(言語レベル)が正しく指定されているかを確認することが、特にコード解析の警告やステータスバー表示の問題解決には重要でした。

同様の問題に遭遇した方の助けになれば幸いです。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?