Javaのインストールに少々はまった話 in Windows10

そうだ JavaでWebアプリケーションを作ろう

今回はJavaでWebアプリケーションを作ろうとしてWindows10にJavaをインストールしたのですが、今まで色々とブラックボックスのまま来てしまったためにハマったお話です。このような細かな話は理解していないで進めている人も多いのではないでしょうか。当記事を読んでスッキリしていってください。

さて、まずはJavaをダウンロードするわけです。しかしJavaにはパッケージがいくつかあり、今回の件ではどれを選択すればいいのか。パッケージの分類をおさらいしてみましょう。なお、今回はOracleのJavaについてお話します。

JDK(Java Development Kit)

JDKはJavaの分類でごっちゃになりやすいですが、JavaSEに属しています。JavaSEはJDKとJREに分類されるのです。

Java SE( JDK、JRE )

JDKとJREはそれぞれ、Development、Runtimeの頭文字をとってきています。Java アプリケーションを動かすだけならRuntime、Java アプリケーションを開発するならDevelopmentといった具合に使い分けます。

JREの単体配布はJava10までで終了したようです。Java11以降は、JREのみを使用したい場合でもJDKを入れる必要があります。

JavaSEはJavaの基本ライブラリの入ったJavaです。JavaEEはJavaSEにプラスして、サーバー側の実装まで出来るライブラリの入ったJavaです。

今回はJavaSEのJDKをインストールします。

インストール

次のサイトからJDKをダウンロードしました。

Java SE Development Kit 8 Downloads – ORACLE

ダウンロードしたファイルを実行してJavaを次の場所にインストールしました。

C:\Program Files\Java\jdk1.8.0_291

ここまでは簡単です。難しいのは設定の方で、やるべきことがあります。と言っても、やり方と意味さえわかってしまえばとても簡単なことですので怖がることはありません。

インストールしたJavaを有効にするにはシステム環境変数のPathを編集する必要があります。と、思っていたのですが最近のJavaではJavaをインストールすると自動で有効に設定されるようです。

(システム環境変数をWindows10で確認するにはスタートパネルで「システムの詳細」とン入力して遷移するのが便利です)

これには非常に驚きました。コマンドプロンプトで java -version と入力して現在有効なJavaのバージョンを確認できるのですが、インストールしただけで有効になっているのです。システム環境変数を設定していないのに。

>java -version
java version "1.8.0_291"
Java(TM) SE Runtime Environment (build 1.8.0_291-b10)
Java HotSpot(TM) 64-Bit Server VM (build 25.291-b10, mixed mode)

ナニコレわからないことするの辞めてって感じだったのですが、これはWeb上でも散見されて、みなさん困惑しているようですね。ですので、少しまとめておきます。上記コマンドでversion確認したJavaですが、本来はシステム環境変数Pathに対してインストールしたJavaの場所を追加しなければ有効になりません。しかし、システム環境変数Pathを確認してみると、現在はインストールしたJavaの場所は追加されていませんでした。では、Javaはどこを見てバージョン情報を返したのでしょうか。

そんなときには、where java というコマンドが便利です。Javaの場所を確認することが出来ます。そうしてJavaの場所確認をしますと C:\ProgramData\Oracle\Java\javapath と出てきました。

>where java
C:\Program Files (x86)\Common Files\Oracle\Java\javapath\java.exe
C:\Program Files\Java\jdk1.8.0_291\bin\java.exe

オイオイなんだよこんなところに Java 入れた覚え無いぞというお話なのですが、これはデフォルトで設定されるもののようです。Javaをインストールするとデフォルトで上記のパスにJavaをインストールした場所のシンボリックリンク(私の環境では実アプリケーションでした)を配置します。

システムの環境変数 Path にも C:\ProgramData\Oracle\Java\javapath との記載がありました。以前の自分で設定する方法に慣れてしまっている方はナニコレ有難迷惑設定!と思うかもしれませんが、このような仕組みになっているようです。

というわけで、自分で設定する方法に慣れている私は以前と同様の設定状況にしたいと思いました。以前と同様の設定にしたいのは、今回インストールしたJava9系でなく8系も使いたかったためです。システム環境変数Pathを指定しなおせば8でも9でも自由に使えると思いました。

・JAVA_HOME C:\Program Files\Java\jdk1.8.0_161

・Path %JAVA_HOME%\bin

と、思ったのですが次の記事を発見。

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

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

JAVA_HOMEが効かない!?複数のJDKを切り替えて使うときの問題点 | ぱーくん plus idea
開発者の宿命というか、JavaのJDKを複数自分のPCにインストールしています。 メインの開発はJDK1.7で行い、最新のプロダクトを試してみるためには、JDK1.8を使用するといった具合に。 私のWindowsには1.6,1.7,1.8のバージョンがインストールされているのですが、自分の思ったようにJDKのバージョン...

まじですか、Javaをinstallするとレジストリにまで影響があるのですか。。レジストリはいじりたくない。ということで、おとなしく現状に登録されているJava8系を使用していこうと思います。

要注意なのは、システム環境変数のPathは設定されているけど、JAVA_HOMEは設定されていないので自分で設定する必要があります。

JAVA_HOME は Tomcat で使われる設定で、システム環境変数にJAVA_HOMEを追加してC:\Program Files\Java\jdk1.8.0_291を設定します。コマンドプロンプトで確認すると設定されたことが分かります。

>set JAVA_HOME
JAVA_HOME=C:\Program Files\Java\jdk1.8.0_291

また、javaコマンドは実行できますが、javacコマンドは実行できないということです。javacコマンドを実行するにはシステム環境変数のPathにC:\Program Files\Java\jdk1.8.0_291を追加します。これもコマンドプロンプトで確認すると設定されたことが分かります。

>javac -version
javac 1.8.0_291

以上、Java install に少々はまった話でした。