Crear un JAR ejecutable en Java desde la terminal

Un JAR ejecutable es un archivo ZIP con tus clases compiladas y un manifiesto que dice cuál es la clase principal. Es la forma estándar de repartir un programa de Java: quien lo recibe lo ejecuta con java -jar programa.jar. Se puede crear con las herramientas que trae el JDK, sin Maven ni un IDE.

El programa

package mx.ejemplo;

public class Saludo {
    public static void main(String[] args) {
        String nombre = args.length > 0 ? args[0] : "mundo";
        System.out.println("¡Hola, " + nombre + "!");
        System.out.println("Java " + Runtime.version().feature());
    }
}

Compilar, empaquetar y ejecutar

cd jar
javac -d clases src/mx/ejemplo/Saludo.java
jar --create --file saludo.jar --main-class mx.ejemplo.Saludo -C clases .
java -jar saludo.jar Lupita
jar --list --file saludo.jar
salida¡Hola, Lupita!
Java 25
META-INF/
META-INF/MANIFEST.MF
mx/
mx/ejemplo/
mx/ejemplo/Saludo.class
  1. javac -d clases compila y deja los .class en la carpeta clases, con una subcarpeta por paquete.
  2. jar --create empaqueta esa carpeta (-C clases .) y --main-class escribe en el manifiesto qué clase arranca.
  3. java -jar lee el manifiesto y ejecuta esa clase; lo que va después del nombre del JAR llega como argumentos.
  4. jar --list enseña lo que hay dentro: las clases y el manifiesto, META-INF/MANIFEST.MF.

Y si el programa usa bibliotecas

Un JAR normal no incluye las bibliotecas de las que depende: hay que pasarlas con --class-path o listarlas en el manifiesto con Class-Path. Para repartir un solo archivo con todo dentro (un «fat JAR») se usan Maven, con el plugin Shade, o Gradle, con Shadow. Y si quieres un instalador para Windows, macOS o Linux que no necesite tener Java instalado, el JDK trae jpackage.

Todo el código se compiló y se ejecutó con Java 25 LTS en un contenedor limpio antes de publicar esta página; las salidas están copiadas de esa ejecución.