W3docs

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 .java y produce archivos .class.
  • java — el lanzador. Carga la JVM, encuentra una clase por nombre y ejecuta su método main.
  • 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 --version

Compilar 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.java

Si no hay errores, verás un nuevo archivo en el mismo directorio llamado Greeting.class. Ese es el bytecode. Ejecútalo:

java Greeting
Hello 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 out le indica a javac que coloque los archivos .class generados en el directorio out/ (recreando la estructura de directorios del paquete).
  • -cp out le indica a java que busque clases en el classpath out/.
  • com.example.greet.Greeting es 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.java

El 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.

Nota

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> /exit

No 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 javacjava en nuestro servidor cada vez que presionas Run:

java— editable, runs on the server

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, un import faltante 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, o javac apuntó 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.

Práctica

Práctica
¿Qué comando compila Greeting.java en bytecode?
¿Qué comando compila Greeting.java en bytecode?
Was this page helpful?