JAVA_HOMEが効かない!?複数のJDKを切り替えて使うときの問題点

開発者の宿命というか、JavaのJDKを複数自分のPCにインストールしています。

メインの開発はJDK1.7で行い、最新のプロダクトを試してみるためには、JDK1.8を使用するといった具合に。

私のWindowsには1.6,1.7,1.8のバージョンがインストールされているのですが、自分の思ったようにJDKのバージョンを切り替えて使うことができなくなっていました。

その解決策を模索した時のログです。

そもそも私の知っているJavaのバージョン切り替えの仕組みは、環境変数「JAVA_HOME」にJDKへのパスをセットし、さらに「PATH」に「%JAVA_HOME%\bin」といったjava.exeのある

ディレクトリへのパスを設定することで行うといったものでした。

ただ、今回、それを行ってもうまく切り替わってくれません。。。

なんでJDKが切り替わらないのか

Oracleの、Javaへのパスを通す仕組みは、JDK8とそれ以前で変わっています。

JDK8以前は、Javaのインストール時に「C:\Windows\System32」配下にインストールしたバージョンの「java.exe」「javaw.exe」「javaws.exe」がコピーされていました。

それが、JDK8になってから「C:\ProgramData\Oracle\Java\javapath」配下に「java.exe」「javaw.exe」「javaws.exe」のシンボリック・リンクが作成され、インストールしたJDKへのショートカットとなっています。

複数のJDKをインストールすると、これらの複数のパスが混在し、どれが最初に効いてくるかでシステムのJDKのバージョンが決まるため、従来の方法でPATHを変更しても、

それが効かないといった状態になってるようです。

解決方法

それらを解決するには、いわばインストーラによって「勝手に」変更される環境をきれいにして、自分の設定が反映されるようにすればいいわけです。

①「C:\Windows\System32」配下にある「java.exe」「javaw.exe」「javaws.exe」を削除またはリネーム)

インストーラによってコピーされるこれらのファイルを消します。削除が不安という方はリネームでもいいと思います。

私は__java.exeのようにリネームしました。

インストールしたJDKのバージョンによっては「C:\Windows\SysWOW64」配下にもおなじファイルがある場合がありますので、同じ対応をします。

②環境変数「PATH」に「C:\ProgramData\Oracle\Java\javapath」が入っている場合は、それを一番下にもってくる

JDK8以降のJDKをインストールしている場合は、「C:\ProgramData\Oracle\Java\javapath」が追加されていますので、それを一番下に持ってきて、最後に読み込むようにします。

③「JAVA_HOME」と「PATH」のセット

上記2つの対応を行えば、従来のように、「JAVA_HOME」にJDKへのパスをセットし、さらに「PATH」の最初の方に「%JAVA_HOME%\bin」を追加すればJDKの切り替えが思ったようにできると思います。

こんなエラーが出る場合は

場合によっては

Error: Registry key ‘Software\JavaSoft\Java Runtime Environment’\CurrentVersion’

has value ‘1.8’, but ‘1.7’ is required.

というエラーが出る場合があります。

これは、「C:\Windows\System32」配下にある「java.exe」が起動時に、レジストリに登録されているJDKバージョンを見に行き、自分自身のバージョンと異なればエラーを吐いて起動しないようにしているためのようです。

つまり、このエラーが出るということは、何らかの原因でまだ「C:\Windows\System32\javaexe」への設定が有効になっています。もう一度設定を見直してみましょう。