・動機
Minecraft1.18をやるぞ~と思ってJava17を入れたあと、Java8じゃないと動かないアプリケーションを起動しようとしたときに困った。
・方針
コマンドラインでJavaを実行するとき、バージョンは環境変数PATHによって先に見つかったものから実行される。したがって、Javaを実行する前に、PATHの先頭に実行したいバージョンのJavaのパスを一時的にくっつけてやればよい。
・下準備
事前にJavaのパスを確認しておこう。たいていの場合はC:\Program Files\Java\jdk-<Javaのバージョン>\bin
にあるだろうと思われる。もしもなければ、コマンドプロンプトでPATHを表示してそこから探すと見つかるはずだ。下のようにバーーーーーッといろいろ出てくるがその中にJavaがあるはずだ。
> PATH
PATH=C:\Program Files\Common Files\Oracle\Java\javapath;
C:\ProgramData\Oracle\Java\javapath;
C:\Windows;
C:\Windows\System32\Wbem;
C:\WINDOWS\system32;
C:\Program Files\Java\jdk1.8.0_102\bin; ←これと
C:\WINDOWS\System32\OpenSSH\;
C:\Program Files\Java\jdk-17.0.1\bin; ←これ
自分の場合は上の通りJDK1.8 ( Java8 )とJDK17 ( Java17 )が同時に含まれている。バージョン表記がわかりにくいが、Java8以前は 1.n.x
だったものがJava9以降から n.x.x
に変わっていることに留意されたい。どうしてこうなった。
・バッチをつくる
毎回Javaを使うたびに手作業でPATHをいじっていてはやってられないので、自動化してしまう。やることは単に環境変数PATHの前に実行したいバージョンのJavaのパスをくっつけるだけだから大したことはない。
@echo off
set path=C:\Program Files\Java\jdk1.8.0_102\bin;%PATH%
echo switched to java8
これを適当なフォルダに適当なファイル名(C:\java_switch\java8.bat
とでもしよう)で保存し、実行してみると、PATHの先頭に所望の文字列がくっついてるはずだ。
> java8.bat
switched to java8
> PATH
PATH=C:\Program Files\Java\jdk1.8.0_102\bin; ←これ
C:\Program Files\Common Files\Oracle\Java\javapath;
C:\ProgramData\Oracle\Java\javapath;
C:\Windows;
C:\Windows\System32\Wbem;
C:\WINDOWS\system32;
C:\Program Files\Java\jdk1.8.0_102\bin;
C:\WINDOWS\System32\OpenSSH\;
C:\Program Files\Java\jdk-17.0.1\bin;
ちなみにここでのPATHの書き換えの影響はコマンドプロンプトを閉じれば元に戻るので、実行するたびにPATHが永遠に長くなるようなこともなく、安心だ。
実際にこの状態でJavaのバージョンを確認してみるとちゃんと切り替わっている。
> java -version
java version "1.8.0_102"
Java(TM) SE Runtime Environment (build 1.8.0_102-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.102-b14, mixed mode)
・もうひと手間
今の状態では、バッチファイルを保存してあるフォルダからでないと、いちいち実行するために相対パスか絶対パスでファイルの位置を指定してやらないと実行ができない。
> java8.bat ←別のフォルダから実行するとエラーに
'java8.bat' is not recognized as an internal or external command,
operable program or batch file.
> C:\java_switch\java8.bat ←位置を正確に記述すればOK
switched to java8
どうせなのでこのバッチファイルをどこからでも呼び出せるようにしてしまう。
Windowsのシステム設定から、環境変数PATHにバッチファイルを保存しているフォルダ(ここでは C:\java_switch\
)を追加しよう。詳しいやり方はここでは割愛する。下のようにPATHに入っていればOKだ。
> PATH
PATH=C:\Program Files\Common Files\Oracle\Java\javapath;
C:\ProgramData\Oracle\Java\javapath;
C:\Windows;
C:\Windows\System32\Wbem;
C:\WINDOWS\system32;
C:\Program Files\Java\jdk1.8.0_102\bin;
C:\WINDOWS\System32\OpenSSH\;
C:\Program Files\Java\jdk-17.0.1;
C:\java_switch; ←これ
この状態でバッチファイルを実行すれば、どこからでもファイル名を書くだけでJavaのバージョンを切り替えることができる。
> java8.bat ←どこからでもOK
switched to java8
・バッチの中から使う
最後に、Javaアプリケーションを起動するためにバッチを使うことも多いと思うので、その際に注意すべき点について。
一般に、バッチ(親)の中から、コマンドラインと同じ要領でバッチ(子)を召喚すると、子の処理が終了した時点で親のバッチも終了してしまう。例えば下のようなバッチを実行したとしよう。
@echo off
java8.bat
java -jar hogehoge.jar
すると2行目にあるjava8.bat
を実行した時点で全体の処理が完全に終了してしまい、3行目にあるjava
コマンドの実行は全く行われない。
これを回避するためにはcall
を使って
@echo off
call java8.bat
java -jar hogehoge.jar
とすることで、親バッチに戻って処理を継続することができる。
Minecraftたのしい