使用するjavaの切替をコマンドかバッチで切り替えたいと思い作成。
SetEnvironmentVariableで設定した後、環境変数の変更を反映するためにpowershellを起動しなおしてjava -version
としていたのですが
GetEnvironmentVariableで再読み込みすれば変更を反映できるようなのでスクリプトにしました。
なお、PowerShell ISEで実行するとエラーになります…。(未解決の事象 参照)
環境
Window 10
PSVersion : 5.1.19041.1682
ソース
javaへのPathは、%JAVA_HOME%/bin で通している前提です。
param(
[Parameter(Mandatory=$true)]
[String]$javaVersion
)
# user's setting
$javaPath = @{
'8' = 'C:\jdk\openjdk-8'
'11' = 'C:\jdk\openjdk-11'
}
# check and set
if ($javaVersion -in $javaPath.Keys) {
echo ''
echo "set version : $javaVersion"
# set JAVA_HOME
[System.Environment]::SetEnvironmentVariable("JAVA_HOME", $javaPath[$javaVersion], "User")
# reload JAVA_HOME, Path
$env:JAVA_HOME = [System.Environment]::GetEnvironmentVariable("JAVA_HOME", "User")
$env:Path = [System.Environment]::GetEnvironmentVariable("Path","Machine") + ";" `
+ [System.Environment]::GetEnvironmentVariable("Path","User")
} else {
echo ''
echo "input version is invalid!!"
}
# display version
echo ''
echo '---------- java version ----------'
java -version
echo ''
使い方
- 変数
$javaPath
にバージョン(key)とJAVA_HOMEに設定するパスを設定する。 - 引数にバージョンを指定して実行する。
実行例
通常パターン
PS > ./setJAVAHOME.ps1 11
set version : 11
---------- java version ----------
openjdk version "11" 2018-09-25
OpenJDK Runtime Environment 18.9 (build 11+28)
OpenJDK 64-Bit Server VM 18.9 (build 11+28, mixed mode)
PS >
引数が間違っている
PS > ./setJAVAHOME.ps1 1
input version is invalid!!
---------- java version ----------
openjdk version "11" 2018-09-25
OpenJDK Runtime Environment 18.9 (build 11+28)
OpenJDK 64-Bit Server VM 18.9 (build 11+28, mixed mode)
PS >
引数忘れた
PS > ./setJAVAHOME.ps1
コマンド パイプライン位置 1 のコマンドレット setJAVAHOME.ps1
次のパラメーターに値を指定してください:
javaVersion: 11
set version : 11
---------- java version ----------
openjdk version "11" 2018-09-25
OpenJDK Runtime Environment 18.9 (build 11+28)
OpenJDK 64-Bit Server VM 18.9 (build 11+28, mixed mode)
PS >
未解決の事象
Powershellからこのスクリプトを実行した場合は問題なく動いているが、
PowerShell ISEで実行するとエラーになる。
エラー時出力内容
PS C:\nablarch> ./setJAVAHOME.ps1 11
set version : 11
---------- java version ----------
java : openjdk version "11" 2018-09-25
発生場所 C:\nablarch\setJAVAHOME.ps1:33 文字:1
+ java -version
+ ~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (openjdk version "11" 2018-09-25:String) [], RemoteException
+ FullyQualifiedErrorId : NativeCommandError
OpenJDK Runtime Environment 18.9 (build 11+28)
OpenJDK 64-Bit Server VM 18.9 (build 11+28, mixed mode)
PS C:\nablarch>
PS C:\nablarch> ./setJAVAHOME.ps1 8
set version : 8
---------- java version ----------
java : openjdk version "1.8.0_42"
発生場所 C:\nablarch\setJAVAHOME.ps1:33 文字:1
+ java -version
+ ~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (openjdk version "1.8.0_42":String) [], RemoteException
+ FullyQualifiedErrorId : NativeCommandError
OpenJDK Runtime Environment (build 1.8.0_42-b03)
OpenJDK Client VM (build 25.40-b25, mixed mode)
PS C:\nablarch>
こちらの記事 PowerShellからのPATH設定がなんかうまくいかない話。 で、
環境変数Pathに環境変数を含むパスを含めるとうまくいかない事象(実験)が書かれているが、
どうやら環境変数Pathに含まれる環境変数の設定値を変更するのもだめらしい。
javaコマンドが認識されていないようで、
スクリプトの実行に限らず、SetEnvironmentVariableで設定した後に
java -version
と直接コマンド入力した場合もエラーとなる。
参考
スクリプトを書くときに参考にしたQiitaの記事