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のある
ディレクトリへのパスを設定することで行うといったものでした。
ただ、今回、それを行ってもうまく切り替わってくれません。。。
目次
なんで切り替わらないのか
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」への設定が有効になっています。もう一度設定を見直してみましょう。
[…] 上複数のJDKが混在すると場合、ちゃんとJDK1.8にならない場合がありますが、そんな時はこの記事「JAVA_HOMEが効かない!?複数のJDKを切り替えて使うときの問題点」を参考にしてください。 […]
[…] https://web.plus-idea.net/2017/04/java_home-swich-jdk/ […]
[…] https://web.plus-idea.net/2017/04/java_home-swich-jdk/ […]