Cómo compilar y ejecutar un programa Java
Usa javac para compilar archivos .java en bytecode .class y el lanzador java para ejecutarlos en la JVM.
Un programa Java pasa por dos etapas antes de producir una salida. Primero, el compilador convierte tus archivos fuente .java en bytecode neutral a la plataforma (archivos .class). Luego, la JVM carga ese bytecode y lo ejecuta. Entender ambas etapas es lo que te permite razonar sobre errores de classpath, empaquetado y los casos límite extraños que ocasionalmente aparecen.
Este capítulo recorre la cadena de herramientas — javac, java y jshell — y el diseño de archivos que esperan estas herramientas.
La cadena de herramientas
Cuando instalas el JDK obtienes tres comandos que usarás constantemente:
javac— el compilador de Java. Toma archivos fuente.javay produce archivos.class.java— el lanzador. Carga la JVM, encuentra una clase por nombre y ejecuta su métodomain.jshell— un REPL interactivo (bucle de lectura-evaluación-impresión) para probar fragmentos de código sin escribir un programa completo. Añadido en Java 9.
Puedes confirmar que están disponibles ejecutando cada uno con -version:
javac -version
java -version
jshell --versionCompilar un solo archivo fuente
Supongamos que tienes este archivo guardado como Greeting.java:
public class Greeting {
public static void main(String[] args) {
System.out.println("Hello from javac!");
}
}Compílalo:
javac Greeting.javaSi no hay errores, verás un nuevo archivo en el mismo directorio llamado Greeting.class. Ese es el bytecode. Ejecútalo:
java GreetingHello from javac!Observa que pasas el nombre de la clase, no el nombre del archivo. java Greeting.class es incorrecto; también lo es java Greeting.java.
Compilar un programa con paquetes
Los programas reales se organizan en paquetes que reflejan su estructura de directorios. Una clase declarada como package com.example.greet; debe estar en com/example/greet/.
project/
└── src/
└── com/example/greet/
└── Greeting.java// src/com/example/greet/Greeting.java
package com.example.greet;
public class Greeting {
public static void main(String[] args) {
System.out.println("Hello with packages!");
}
}Desde el directorio project/, compila y ejecuta con el nombre de clase completamente calificado:
javac -d out src/com/example/greet/Greeting.java
java -cp out com.example.greet.Greeting-d outle indica ajavacque coloque los archivos.classgenerados en el directorioout/(recreando la estructura de directorios del paquete).-cp outle indica ajavaque busque clases en el classpathout/.com.example.greet.Greetinges el nombre de clase completamente calificado — el paquete, un punto y la clase.
En la práctica usarías una herramienta de compilación (Maven o Gradle, tratados más adelante en este libro) para hacer todo esto. Pero saber lo que hacen internamente ayuda cuando algo falla.
Modo de archivo fuente (programas de un solo archivo)
Desde Java 11 puedes omitir javac por completo para programas de un solo archivo:
java Greeting.javaEl lanzador compila en memoria y ejecuta el resultado de inmediato — no se escribe ningún archivo .class en disco. Es ideal para scripts rápidos y ejercicios del libro.
El modo de archivo fuente solo funciona cuando el programa cabe en un único archivo .java. En el momento en que dividas tu código en dos archivos fuente, vuelve a javac (o una herramienta de compilación) para compilarlos juntos.
jshell — el REPL interactivo
jshell te permite escribir expresiones y sentencias Java de una línea a la vez, igual que un REPL de Python o Node:
$ jshell
| Welcome to JShell -- Version 21.0.4
| For an introduction type: /help intro
jshell> int x = 21
x ==> 21
jshell> int y = 21
y ==> 21
jshell> x + y
$3 ==> 42
jshell> System.out.println("Hello!")
Hello!
jshell> /exitNo necesitas una clase, un método main ni siquiera punto y coma para expresiones simples. Es una excelente manera de explorar la biblioteca estándar sin configurar un proyecto.
Ejecutar desde el IDE
Todos los IDE de Java — IntelliJ, Eclipse, VS Code — invocan javac y java entre bastidores cuando haces clic en Run. El IDE también gestiona el classpath, muestra los errores del compilador en línea y presenta la salida del programa en un panel de consola. No tienes que usar la línea de comandos, pero saber lo que hace el IDE facilita mucho la depuración de problemas de compilación.
Un ejemplo en vivo
El bloque ejecutable a continuación pasa por el mismo ciclo javac → java en nuestro servidor cada vez que presionas Run:
Edita el código, presiona Run y el servidor compilará tu código fuente modificado e imprimirá lo que el programa produzca.
Errores de compilación comunes
Algunos errores que encontrarás con frecuencia:
class Greeting is public, should be declared in a file named Greeting.java— el nombre del archivo y el nombre de la clase pública deben coincidir exactamente.error: cannot find symbol— generalmente un error tipográfico, unimportfaltante o una clase que no está en el classpath.';' expected— un punto y coma faltante al final de una sentencia.error: package x.y.z does not exist— el directorio del paquete no está en el classpath, ojavacapuntó a la raíz fuente incorrecta.
Ante la duda, lee el mensaje de error — los diagnósticos de javac son excepcionalmente claros.
Qué sigue
Con las herramientas a tu disposición, la siguiente parte del libro comienza con el lenguaje en sí: Java Variables, Data Types y el resto de los fundamentos de sintaxis.