JRE y JDK: diferencias, función de la JVM y qué paquete Java instalar
Un JRE (Java Runtime Environment) ejecuta programas Java compilados. Un JDK (Java Development Kit) proporciona capacidades de ejecución más un compilador y herramientas de desarrollo, por lo que se debe elegir un JDK al aprender Java o construir código fuente. Para ejecutar una aplicación existente, sigue sus requisitos de ejecución; una aplicación que incluya su propio entorno de ejecución puede no necesitar una instalación de Java por separado.
¿Qué es un JRE?
Un JRE es el entorno necesario para ejecutar programas Java compilados. Combina una JVM (Máquina Virtual de Java), bibliotecas de clases estándar y archivos de soporte de tiempo de ejecución. El bytecode es el formato de instrucciones utilizado por la JVM, normalmente almacenado en archivos .class producidos a partir del código fuente Java.
Un paquete típico de JRE solo de tiempo de ejecución no proporciona el compilador de código fuente javac. Poder ejecutar java, por lo tanto, no prueba que las herramientas de desarrollo estén instaladas. Además, distingue el concepto de entorno de ejecución de los nombres de paquetes disponibles en un sitio de descarga en particular.
¿Qué es un JDK?
Un JDK proporciona herramientas para desarrollar y ejecutar programas Java. Usa javac para compilar archivos fuente y java para ejecutar programas. Un JDK de desarrollo ya proporciona capacidades de ejecución, por lo que no necesita una segunda instalación de JRE únicamente para ejecutar programas con ese JDK.
javaccompila archivos fuente.javaen archivos.class.javainicia la JVM y lanza un programa Java.jarempaqueta clases y recursos en un archivo JAR (Java Archive).javadocgenera documentación de API (Interfaz de Programación de Aplicaciones) a partir de declaraciones y comentarios de documentación.jdbadmite la depuración, incluyendo detener la ejecución e inspeccionar variables.
Esto no significa que un JDK incluya todos los editores o IDE (Entorno de Desarrollo Integrado). Puedes elegir un editor por separado, y un IDE puede requerir que selecciones un JDK de proyecto para compilar código. El rol del compilador se describe en Referencia de javac de Oracle.
¿Cómo se relacionan la JVM, el JRE y el JDK?
La JVM es el componente que ejecuta el bytecode. Un JRE agrega bibliotecas y archivos de soporte para formar un entorno de ejecución; un JDK agrega herramientas de desarrollo mientras también proporciona capacidades de ejecución. Estos términos describen diferentes roles y alcances.
Por ejemplo, javac convierte HelloWorld.java en HelloWorld.class, y java HelloWorld lanza el programa en una JVM. Un archivo de clase puede ejecutarse en otro sistema operativo con un runtime compatible, pero las aplicaciones que usan bibliotecas nativas o versiones particulares de Java tienen requisitos adicionales. Consulta la introducción a la especificación de Java Virtual Machine para la relación entre la JVM y los archivos de clase.
Comparación JRE vs JDK
| Criterio | JRE solo para ejecución | JDK |
|---|---|---|
| Propósito principal | Ejecutar aplicaciones compiladas | Desarrollar, compilar y ejecutar aplicaciones |
| JVM y bibliotecas de tiempo de ejecución | Incluido | Incluido |
| lanzador de java | Típicamente disponible | Disponible |
| compilador javac | Típicamente ausente | Disponible |
| Cuándo elegirlo | Una aplicación requiere un tiempo de ejecución externo compatible | Aprender Java, compilar código fuente o trabajo de desarrollo |
| Disponibilidad de descarga | Depende del proveedor, la versión y el sistema operativo | Elige un proveedor y una plataforma compatible |
Esta tabla compara los roles habituales de un paquete solo de tiempo de ejecución y un kit de desarrollo. Un runtime personalizado puede contener una selección diferente de módulos, por lo que su nombre por sí solo no garantiza que todas las bibliotecas o herramientas estén presentes.
¿Contiene un JDK moderno una carpeta JRE?
“El JDK incluye el JRE” es una abreviatura útil para las capacidades de tiempo de ejecución, pero no es una descripción precisa de cada diseño de directorio actual. El JDK 8 y versiones anteriores utilizaban un directorio interno jre/; el JDK 9 introdujo imágenes de tiempo de ejecución modulares. Oracle dejó de ofrecer descargas separadas de JRE y Server JRE con el JDK 11. La Guía de migración de Oracle JDK 11 explica estos cambios en el empaquetado y el diseño.
Eso no significa que todos los proveedores hayan dejado de distribuir paquetes solo de tiempo de ejecución. La página de descarga de Eclipse Temurin distingue entre paquetes JDK y JRE; verifica lo que está realmente disponible para la versión y el sistema operativo que necesitas. Un cambio de empaquetado realizado por un proveedor no es una regla universal de Java.
Los desarrolladores también pueden usar la herramienta jlink del JDK para reunir los módulos necesarios y sus dependencias en una imagen de ejecución personalizada. Incluir ese entorno en una aplicación puede reducir la necesidad de instalar un JRE del sistema por separado. La selección de módulos y sus actualizaciones siguen siendo responsabilidad del distribuidor, como explica la referencia de jlink.
¿Qué paquete y versión deberías elegir?
- Aprendizaje y desarrollo: elige la versión de JDK requerida por tu curso o proyecto, incluidas las versiones compatibles con las herramientas de compilación y las bibliotecas.
- Ejecutar una aplicación existente: revisa sus instrucciones de instalación para la versión de Java requerida y si necesita un entorno de ejecución externo. Cambiar la Java del sistema puede no tener efecto en una aplicación con un entorno de ejecución incluido.
- Despliegue en servidor: elige una configuración compatible con los módulos requeridos, el sistema operativo y la arquitectura de CPU. Un servidor que también compile código fuente o necesite herramientas JDK puede requerir un JDK.
Un número de versión más grande por sí solo no garantiza compatibilidad. Por ejemplo, un entorno de ejecución Java 17 no puede necesariamente leer una clase compilada para Java 21. Ejecutar una aplicación más antigua en Java más reciente también requiere verificar las características eliminadas y la compatibilidad de bibliotecas.
Para tu propio código fuente, considera javac --release al apuntar a una versión de Java anterior soportada. Esto restringe las características del lenguaje, las API de la plataforma y la salida de archivos de clase, pero no hace automáticamente compatibles las dependencias externas. Prueba el resultado en el entorno de ejecución objetivo real.
Instala un JDK y verifica los ejecutables seleccionados
En una página oficial de descargas, selecciona el tipo de paquete, la versión de Java, el sistema operativo y la arquitectura de la CPU, como x64 o ARM64. Si el distribuidor proporciona sumas de verificación, puede verificar el archivo descargado usando su hash antes de la instalación.
Instalación y comprobaciones en Windows
Con un instalador MSI de Eclipse Temurin, usa Custom Setup para seleccionar el directorio de instalación y las características. Agregar Java a PATH ayuda en el uso desde la línea de comandos; selecciona la característica JAVA_HOME si tus herramientas de compilación lo requieren. Consulta la guía de instalación de Temurin en Windows para estas opciones. Después de la instalación, cierra los terminales existentes y abre uno nuevo.
java -version
javac -version
Verifica que ambos comandos funcionen y reporten la versión principal de Java prevista. Si solo java -version funciona, se encontró el tiempo de ejecución pero el compilador podría no estar disponible. En PowerShell, inspecciona las rutas seleccionadas con:
Get-Command java,javac | Select-Object Name,Source
PATH es la lista de ubicaciones que un terminal busca para archivos ejecutables. JAVA_HOME identifica una ubicación de JDK para herramientas que usan esa variable; apúntalo a la raíz del JDK, no a su directorio bin. Si las dos configuraciones se refieren a instalaciones diferentes, un terminal y una herramienta de compilación pueden usar versiones de Java distintas.
Comprobaciones en macOS y Linux
Usa un paquete o instalador que coincida con su sistema operativo; consulta las guías de instalación de Temurin por plataforma. Después de la instalación, ejecuta java -version y javac -version. Para inspeccionar lo que su shell resuelve, use:
command -v java
command -v javac
El resultado puede ser un enlace simbólico o la ubicación de un gestor de versiones, por lo que no infieras la versión de Java solo por una ruta. Verifica también el JDK del proyecto en el IDE y el resultado de la compilación. Seleccionar un nuevo JDK por proyecto antes de eliminar una instalación anterior facilita regresar a una configuración que funcione.
Compilar y ejecutar un ejemplo pequeño
Con un JDK disponible, crea un directorio de trabajo vacío y guarda este código fuente como HelloWorld.java. Haz que la capitalización del nombre del archivo coincida con el nombre de la clase, y asegura que un editor no haya añadido una extensión .txt. El ejemplo no utiliza declaración de paquete ni bibliotecas externas.
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, Java!");
}
}
Abre una terminal en el directorio que contiene el archivo, luego ejecuta estos comandos en orden:
javac HelloWorld.java
java -cp . HelloWorld
El primer comando crea un archivo de clase. El segundo busca en el directorio actual (.) la clase HelloWorld y la ejecuta. No agregues .class al nombre de la clase. La salida esperada es:
Hello, Java!
JDK 11 y versiones posteriores también pueden ejecutar un archivo fuente directamente con java HelloWorld.java. Esto realiza la compilación internamente, por lo que el nombre del lanzador no implica que un JRE solo de tiempo de ejecución pueda realizar la misma operación. El ejemplo de dos pasos hace visible la distinción entre fuente y clase. Consulta la referencia de java sobre la ejecución de archivos fuente para sus condiciones.
Para empaquetar la clase compilada en un JAR ejecutable, ejecuta lo siguiente en el mismo directorio después de que HelloWorld.class haya sido creado:
jar --create --file hello.jar --main-class HelloWorld HelloWorld.class
java -jar hello.jar
La creación del archivo utiliza una herramienta de desarrollo; ejecutar este JAR completado requiere un runtime compatible. Otras aplicaciones pueden necesitar bibliotecas adicionales u opciones de lanzamiento. Consulta la referencia del comando jar para las opciones de creación de archivos.
Solucionar problemas comunes de instalación y ejecución
| Síntoma | Qué verificar | Cómo proceder |
|---|---|---|
| java o javac no se encuentra | El ejecutable existe y PATH incluye el directorio bin del JDK deseado | Abre un terminal nuevo; también verifica el ejecutable usando su ruta completa |
| java funciona, javac no | Un paquete solo de tiempo de ejecución o rutas de ejecutable mixtas | Instala un JDK de desarrollo o selecciona la ruta de un JDK existente |
| UnsupportedClassVersionError | Comprueba si el entorno de ejecución admite la versión del archivo de clase | Usa un tiempo de ejecución compatible; recompila tu propio código para la versión de destino si es apropiado |
| Could not find or load main class | Nombre de la clase, directorio de trabajo y classpath | Para este ejemplo, ejecuta java -cp . HelloWorld en el directorio que contiene HelloWorld.class |
| Funciona en el IDE, falla en el terminal | JDK del proyecto frente a java y javac del terminal | Verifica el IDE, PATH, JAVA_HOME y la selección del JDK de la herramienta de construcción por separado |
Al diagnosticar un fallo, primero comprueba cuál ejecutable se está ejecutando realmente. Una vez que las rutas y versiones sean correctas y el pequeño ejemplo funcione, investiga las dependencias de la aplicación y las opciones de inicio.




