1. 定义

JRE(Java Runtime Enviroment)Javaの実行環境です。Javaプログラムの利用者向けであり、開発者向けではありません。JREだけをダウンロードしてインストールした場合、システムはJavaプログラムを実行できるだけです。JREはJavaプログラムを実行するために必要な環境の集合であり、JVM標準実装とJavaコアクラスライブラリを含みます。Java仮想マシン、Javaプラットフォームのコアクラス、サポートファイルを含みます。開発ツール(コンパイラ、デバッガなど)は含まれません。

JDK(Java Development Kit)は、J2SDK(Java2 Software Development Kit)とも呼ばれ、Java開発キットです。Javaの開発環境(コンパイラjavacなどのツールを提供し、javaファイルをclassファイルにコンパイルする)と実行環境(JVMとRuntime補助パッケージを提供し、classファイルを解析して実行する)を提供します。JDKをダウンロードしてインストールすれば、Javaプログラムを開発できるだけでなく、Javaプログラムを実行するプラットフォームも同時に手に入ります。JDKはJava全体の中核であり、Java実行環境(JRE)、一連のJavaツールtools.jar、Java標準クラスライブラリ(rt.jar)を含みます。

2. 区别

JREは主に、javaクラスライブラリのclassファイル(すべてlibディレクトリにjarとしてパッケージされている)と仮想マシン(jvm.dll)を含みます。JDKは主に、javaクラスライブラリのclassファイル(すべてlibディレクトリにjarとしてパッケージされている)を含み、さらにJREを1つ同梱しています。では、なぜJDKにJREが同梱されているのでしょうか?しかも、jdk/jre/bin配下のclientとserverの2つのフォルダの両方にjvm.dllが含まれています(JDK同梱のJREには2つの仮想マシンがあることを示しています)。

環境変数 path に jdk/bin のパスを設定するのを覚えていますか?先生方は、設定しないとjavacとjavaは使えないと教えるでしょう。確かにjdk/binディレクトリにはすべてのコマンドが含まれています。しかし、私たちが使っているjavaコマンドはjdk/binディレクトリではなく、jre/binディレクトリにあるのではないかと考えた人はいるでしょうか?信じられなければ実験してみてください。jdk/binディレクトリのjava.exeを別の場所に切り取ってからJavaプログラムを実行してみてください。何がわかりましたか?すべてOKです!(JREにはjavacコマンドがありません。理由は簡単で、開発環境ではないからです。)では、こう疑問に思う人もいるでしょう?私は明らかにjre/binディレクトリを環境変数に設定していないのに?考えてみてください。Javaが大多数の人々に提供するためには、彼らはJDKでの開発は必要なく、JREだけでJavaプログラムを動かせればよいのです。その場合、各顧客が手動で環境変数を設定するのは面倒ではないでしょうか?そこで、JREをインストールするときに、インストーラが自動的にJREのjava.exeをシステム変数に追加してくれます。検証方法は簡単で、Windows/system32を見てみてください。何があるでしょうか?java.exeがあります。

3. 难点

JDKをインストールすると、あなたのパソコンには2つのJREがあることに気づくでしょう。1つは次の場所にあります C:\Program Files\Java\jre6、もう1つのセットは次の場所にあります。C:\Program Files\Java\jdk1.6.0_41\jre 目录下。

JREの立場はPCのようなものです。私たちが書いたWin32アプリケーションはOSに実行してもらう必要があります。同様に、私たちが作成したJavaプログラムもJREがなければ実行できません。そのため、JDKをインストールした後、ハードディスクの異なる2か所に2つのJREをインストールした場合、コンピュータには2台の仮想Java PCがあり、どちらもJavaプログラムを実行する機能を持つと想像できます。したがって、コンピュータにJREがインストールされていれば、Javaアプリケーションを正しく実行できると言えます。

1、なぜSunはJDKに2つの同じJREをインストールさせるのでしょうか?

これは、JDKの中にJavaで書かれた開発ツールが多く含まれているからです。例えば、javac.exe、jar.exeなどです。これらのコマンドはC:\Program Files\Java\jdk1.6.0_41\binディレクトリに配置されています。

それらはjavaで書かれたコマンドであるため、javaのjarパッケージに依存しています。これらのjarパッケージは次の場所に格納されていますC:\Program Files\Java\jdk1.6.0_41\lib目录里。

C:\Program Files\Java\jdk1.6.0_41\lib\ディレクトリ内のtools.jarをtools1.jarにリネームして、javac.exeを実行すると、以下の結果が表示されます。

Exception in thread "main" java.lang.NoClassDefFoundError: com/sun/tools/javac /Main 

ただし入力:

java -cp C:\Program Files\Java\jdk1.6.0_41\lib\tools1.jar com.sun.tools.javac.Mainx

javac.exe と同じ結果が得られます。

ここから、javac.exeは単なるラッパー(Wrapper)であり、開発者が長すぎるコマンドを入力しなくて済むように作られたものであることを証明できます。

さらに、C:\Program Files\Java\jdk1.6.0_41\binディレクトリのプログラムはすべて小さく、29K以下であることがわかります。ここから結論を導き出せます。JDK内のツールはほぼすべてJavaで書かれているため、それらもJavaアプリケーションです。したがって、JDKに付属するツールを使ってJavaプログラムを開発するには、自分用にJREも1セット同梱する必要があります。C:\Program Files\Java\jdk1.6.0_41\jreディレクトリにあるJREは、一般的なJavaプログラムを実行するためのものです。

2、1台のパソコンに2つ以上のJREがインストールされている場合、どれが使われるかは誰が決めるのでしょうか?

この重大な任務は java.exe が担います。java.exe の役割は、Java プログラムを実行するために適切な JRE を見つけることです。java.exe は以下の順序で JRE を探します:自分のディレクトリに JRE があるか;親ディレクトリに JRE があるか;レジストリを照会する:

[HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Runtime Environment] 

したがって、java.exeの実行結果は、コンピュータ内のどのJREが実行されるかに大きく依存します。

文章出处:http://swiftlet.net/archives/639