java.exe の実行パスに環境変数 PATH の設定が反映されない(Windows)

java.exeC:\Windows\System32 にもインストールされる。
したがって、下のように PATH の設定で %SystemRoot%\system32
%JAVA_HOME%\bin よりも先に位置している場合、優先されるのは前者であるから、
%SystemRoot%\system32\java.exe が実行される。

C:\>SET PATH
PATH=...;%SystemRoot%\system32;...%JAVA_HOME%\bin;
対策としては %JAVA_HOME%\bin%SystemRoot%\system32 より先に設定すれば良い。

ところで、ある掲示板で次のような書き込みを見つけたが、最近のバージョンの Java については、この説明は不十分である。

この実行形式ファイルはレジストリを参照して、カレントバージョンのjava.exeを呼び出すだけの動作を行っているようでした。(レジストリを書き換えると実行されるバージョンが変わる)

Javaの道 — 掲示板(パスについて)
まず「カレントバージョンのjava.exeを呼び出すだけ」とあるが、
C:\Windows\System32 にある java.exe は、JREフォルダにあるものと異なるプログラムではない。

C:\>comp C:\Java\jre7\bin\java.exe C:\Windows\System32\java.exe
C:\Java\jre7\bin\java.exe と C:\Windows\System32\java.exe を比較しています...
ファイルに違いはありません
また動作については、バージョン 1.7 を調べたところ以下のような仕様であった。

  • C:\Windows\System32\java.exe の実行ファイルにはバージョン番号が埋め込まれている。
  • 実行時、その埋め込まれているバージョン番号と、レジストリHKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Runtime Environment\CurrentVersion
    の値が比較され、両者のバージョン番号が異なる場合、エラーとなり実行が中断される。
  • 一致している場合、そのバージョンの JVM を起動する。

という動作らしい。

バイナリエディタC:\Windows\System32\java.exe を編集して実験してみた結果である。