Windowsで開発を行う際、複数のJavaバージョンを使い分ける必要があることがあります。従来の環境変数(JAVA_HOME)による制御方法は広く知られていますが、Oracle JDK 9以降で導入された「Java Shim」の仕組みを理解し活用することで、より柔軟にJava環境を管理できます。特に、IDEが特定のバージョンを使用する一方で、コマンドラインでは別のバージョンが使われるという状況を解決するには、両方のアプローチを理解することが重要です。この記事では、環境変数の設定だけでなく、Java Shimを直接制御する方法も含めて、Windowsでシステム全体のJavaバージョンを変更する方法について説明します。
Windowsでは、Oracle JDK 9以降のインストール時に「Java Shim」と呼ばれる比較的新しい仕組みが導入されました。これはJava 8時代には存在しなかった仕組みで、多くの開発者を混乱させる原因となっています。
Java Shimは以下のディレクトリにシンボリックリンクまたは実行ファイル(shimconsole.exe)を配置します:
``` C:\Program Files\Common Files\Oracle\Java\javapath ```
このディレクトリはシステムのPATH環境変数の先頭近くに自動的に追加されるため、`java`コマンドを実行すると、このディレクトリ内のファイルが最初に見つかります。これにより、システムにインストールされている最新のJavaバージョンが自動的に使用されるようになっています。
この仕組みは便利な一方で、以下のような問題を引き起こします:
1. **複数バージョンの管理が困難**:特定のプロジェクトで特定のJavaバージョンを使いたい場合に問題が生じます。
2. **IDEとコマンドラインの不一致**:Windsurfなどの最新のIDEはデフォルトでJava 21などの新しいバージョンを使用するよう設定されていることがありますが、コマンドラインではJava Shimによって別のバージョン(例:Java 17)が使用されることがあります。
3. **PowerShell?での挙動**:PowerShell?はWindows 10以降のデフォルトシェルとなっていますが、環境変数の解決方法がコマンドプロンプトと異なるため、予期しない動作が発生することがあります。
これらの問題により、「IDEでは動くのにコマンドラインでは動かない」といった状況が発生し、開発者を悩ませることになります。
まず、現在使用されているJavaのバージョンと場所を確認しましょう:
# Javaのバージョンを確認 java -version # Javaの実行ファイルの場所を確認 Get-Command java | Format-List # Java Shimの内容を確認 Get-Item "C:\Program Files\Common Files\Oracle\Java\javapath\*.exe" # JAVA_HOME環境変数を確認 echo $env:JAVA_HOME
## Javaバージョンを変更する方法
### 方法1: 環境変数を設定する(推奨)
1. **JAVA_HOME環境変数を設定**:
```powershell
[Environment]::SetEnvironmentVariable("JAVA_HOME", "C:\path\to\your\java\version", "Machine")
```
2. **PATHの先頭にJavaのbinディレクトリを追加**:
```powershell
$path = [Environment]::GetEnvironmentVariable("Path", "Machine")
$java21bin = "%JAVA_HOME%\bin"
if ($path -notlike "*$java21bin*") {
[Environment]::SetEnvironmentVariable("Path", "$java21bin;$path", "Machine")
}
```
3. **システムを再起動**または新しいコマンドプロンプトを開く
4. **変更を確認**:
```powershell echo $env:JAVA_HOME java -version ```
1. **バックアップディレクトリを作成**:
```powershell New-Item -ItemType Directory -Path "C:\Program Files\Common Files\Oracle\Java\javapath_backup" -Force ```
2. **既存のファイルをバックアップ**:
```powershell Copy-Item "C:\Program Files\Common Files\Oracle\Java\javapath\*.exe" -Destination "C:\Program Files\Common Files\Oracle\Java\javapath_backup\" ```
3. **既存のShimファイルを削除**:
```powershell Remove-Item "C:\Program Files\Common Files\Oracle\Java\javapath\java.exe" Remove-Item "C:\Program Files\Common Files\Oracle\Java\javapath\javac.exe" Remove-Item "C:\Program Files\Common Files\Oracle\Java\javapath\javaw.exe" Remove-Item "C:\Program Files\Common Files\Oracle\Java\javapath\jshell.exe" ```
4. **新しいJavaバージョンへのシンボリックリンクを作成**:
```powershell $javaPath = "C:\path\to\your\java\version\bin" New-Item -ItemType SymbolicLink -Path "C:\Program Files\Common Files\Oracle\Java\javapath\java.exe" -Target "$javaPath\java.exe" New-Item -ItemType SymbolicLink -Path "C:\Program Files\Common Files\Oracle\Java\javapath\javac.exe" -Target "$javaPath\javac.exe" New-Item -ItemType SymbolicLink -Path "C:\Program Files\Common Files\Oracle\Java\javapath\javaw.exe" -Target "$javaPath\javaw.exe" New-Item -ItemType SymbolicLink -Path "C:\Program Files\Common Files\Oracle\Java\javapath\jshell.exe" -Target "$javaPath\jshell.exe" ```
5. **システムを再起動**
Windsurfでは、`settings.json`ファイルに以下の設定を追加することで、特定のJavaバージョンを使用できます:
"java.home": "C:\\path\\to\\your\\java\\version", "java.jdt.ls.java.home": "C:\\path\\to\\your\\java\\version", "java.import.gradle.java.home": "C:\\path\\to\\your\\java\\version"
1. **Java更新プログラムによる上書き**:Javaの更新プログラムをインストールすると、Java Shimが上書きされる可能性があります。その場合は再度設定が必要です。
2. **管理者権限**:これらの操作には管理者権限が必要です。
3. **システム全体への影響**:これらの変更はシステム全体に影響します。特定のアプリケーションが特定のJavaバージョンに依存している場合、問題が発生する可能性があります。
Windowsで複数のJavaバージョンを管理するには、環境変数の設定またはJava Shimの更新という2つの主要な方法があります。環境変数の設定は比較的安全で簡単な方法ですが、Java Shimの更新はより直接的な方法です。どちらの方法も、システムの再起動後に有効になります。
開発環境では、プロジェクトごとに異なるJavaバージョンが必要な場合もあるため、これらの方法を理解しておくと便利です。