1. Definición

JRE(Java Runtime Enviroment)Es el entorno de ejecución de Java. Está orientado a los usuarios de programas Java, no a los desarrolladores. Si solo descargas e instalas el JRE, tu sistema solo podrá ejecutar programas Java. El JRE es el conjunto de entornos necesarios para ejecutar programas Java, e incluye la implementación estándar de la JVM y las bibliotecas centrales de Java. Incluye la máquina virtual de Java, las clases centrales de la plataforma Java y los archivos de soporte. No incluye herramientas de desarrollo (compiladores, depuradores, etc.).

El JDK (Java Development Kit), también llamado J2SDK (Java2 Software Development Kit), es el kit de desarrollo de Java. Proporciona el entorno de desarrollo de Java (proporciona herramientas como el compilador javac, utilizadas para compilar archivos .java en archivos .class) y el entorno de ejecución (proporciona la JVM y los paquetes auxiliares de Runtime, utilizados para analizar los archivos .class y hacer que se ejecuten). Si descargas e instalas el JDK, no solo podrás desarrollar programas Java, sino que también tendrás la plataforma para ejecutarlos. El JDK es el núcleo de todo Java, e incluye el entorno de ejecución de Java (JRE), un conjunto de herramientas de Java tools.jar y la biblioteca de clases estándar de Java (rt.jar).

2. Diferencias

El JRE incluye principalmente: los archivos .class de las bibliotecas de Java (todos empaquetados como jar en el directorio lib) y la máquina virtual (jvm.dll); el JDK incluye principalmente: los archivos .class de las bibliotecas de Java (todos empaquetados como jar en el directorio lib) y viene con un JRE. Entonces, ¿por qué el JDK viene con un JRE? Además, tanto la carpeta client como la carpeta server bajo jdk/jre/bin contienen jvm.dll (lo que indica que el JRE incluido con el JDK tiene dos máquinas virtuales).

¿Recuerdas configurar la ruta jdk/bin en la variable de entorno path?El profesor dirá que si no se configura, javac y java no se pueden usar. Ciertamente, el directorio jdk/bin contiene todos los comandos. Pero, ¿alguien ha pensado que el comando java que usamos no es el del directorio jdk/bin, sino el del directorio jre/bin? Si no lo crees, puedes hacer un experimento: corta java.exe del directorio jdk/bin a otro lugar y vuelve a ejecutar un programa Java. ¿Qué descubres? ¡Todo funciona! (En el JRE no hay comando javac, la razón es muy simple: no es un entorno de desarrollo). Entonces alguien preguntará: yo claramente no configuré el directorio jre/bin en la variable de entorno. Piensa: si Java se proporciona para que la mayoría de la gente lo use, ellos no necesitan el JDK para desarrollar, solo necesitan el JRE para que los programas Java puedan ejecutarse. ¿No sería muy molesto que cada cliente tuviera que configurar manualmente las variables de entorno? Por eso, al instalar el JRE, el programa de instalación agrega automáticamente el java.exe del JRE a las variables del sistema. El método de verificación es muy simple: ve a Windows/system32 y mira. ¿Qué descubres? Hay un java.exe.

3. Dificultades

Si has instalado el JDK, descubrirás que tu computadora tiene dos conjuntos de JRE, uno ubicado en C:\Program Files\Java\jre6, el otro ubicado enC:\Program Files\Java\jdk1.6.0_41\jre directorio.

El papel del JRE es como el de una PC. Las aplicaciones Win32 que escribimos necesitan que el sistema operativo las ejecute; de la misma manera, los programas Java que escribimos también necesitan el JRE para ejecutarse. Por lo tanto, cuando instalas el JDK, si hay dos conjuntos de JRE instalados en dos lugares diferentes del disco duro, puedes imaginar que tu computadora tiene dos PC virtuales de Java, ambas con la capacidad de ejecutar programas Java. Así que podemos decir que, siempre que tu computadora tenga instalado el JRE, podrá ejecutar correctamente las aplicaciones Java.

1. ¿Por qué Sun hace que el JDK instale dos JRE iguales?

Esto se debe a que el JDK contiene muchas herramientas de desarrollo escritas en Java, como javac.exe, jar.exe, etc. Estos comandos se encuentran en el directorio C:\Program Files\Java\jdk1.6.0_41\bin.

Debido a que son comandos escritos en Java, dependen de los paquetes jar de Java; estos paquetes jar se almacenan enC:\Program Files\Java\jdk1.6.0_41\libdirectorio.

Si renombras tools.jar en el directorio C:\Program Files\Java\jdk1.6.0_41\lib\ a tools1.jar y luego ejecutas javac.exe, se muestra el siguiente resultado:

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

Pero si ingresas:

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

obtendrás el mismo resultado que con javac.exe.

A partir de esto podemos demostrar que javac.exe es solo un envoltorio (Wrapper), y su propósito es evitar que los desarrolladores tengan que escribir comandos demasiado largos.

Además, podemos descubrir que los programas en el directorio C:\Program Files\Java\jdk1.6.0_41\bin son muy pequeños, no mayores de 29K. De aquí podemos sacar una conclusión: las herramientas del JDK están casi todas escritas en Java, por lo que también son aplicaciones Java. Por lo tanto, para usar las herramientas incluidas con el JDK para desarrollar programas Java, también es necesario incluir un JRE. Así, el JRE en el directorio C:\Program Files\Java\jdk1.6.0_41\jre se usa para ejecutar programas Java en general.

2. Si una computadora tiene instalados más de dos JRE, ¿quién decide?

Esta importante tarea recae en java.exe. El trabajo de java.exe es encontrar el JRE adecuado para ejecutar programas Java. java.exe busca el JRE en el siguiente orden: si hay un JRE en su propio directorio; si hay un JRE en el directorio padre; consultar el registro:

[HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Runtime Environment] 

Por lo tanto, el resultado de ejecutar java.exe está estrechamente relacionado con cuál JRE se ejecuta en tu computadora.

Fuente del artículo: http://swiftlet.net/archives/639