«No main manifest attribute»: por qué Java no ve el punto de entrada en JAR y cómo solucionarlo

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Introducción: conociendo el error que asusta a los principiantes



Has escrito un programa en Java, lo has compilado, lo has empaquetado en un archivo JAR y con orgullo intentas ejecutarlo con un doble clic del ratón, pero en lugar de la ventana de la aplicación ves una ventana negra de terminal con un mensaje aterrador: Can't execute jar- file: "no main manifest attribute". ¿Te suena? Si no, considera que has tenido suerte (por ahora).



Este error es uno de los más populares en Stack Overflow. Imagínate: miles de desarrolladores, desde estudiantes hasta ingenieros experimentados, al menos una vez en la vida se han encontrado con que su archivo JAR «se niega» a ejecutarse. ¿Por qué sucede esto? El problema es que Java no es simplemente «empaqueta y ejecuta». La máquina virtual debe saber claramente: ¿qué clase contiene el punto de entrada? Sin esta información, el archivo JAR sigue siendo un archivo común, no un programa ejecutable.



En este artículo, entenderemos qué es el manifiesto, cómo se relaciona con el punto de entrada y, lo más importante, cómo hacer que tu archivo JAR se ejecute sin errores. Iremos de lo simple a lo complejo: desde la compilación manual en la línea de comandos hasta la configuración del IDE. ¡Allá vamos!



¿Qué es el manifiesto y para qué sirve?



Cada archivo JAR (Java Archive) contiene internamente una carpeta META-INF, y dentro de ella, el archivo MANIFEST.MF. Esto no es solo un artefacto técnico, sino una auténtica «instrucción de uso» para la máquina virtual de Java.



Imagina un libro sin índice. Sabes que tiene capítulos, pero no sabes en qué página empezar a leer. Algo similar sucede con un archivo JAR sin especificar la clase principal. La máquina virtual ve muchas clases, pero no sabe cuál de ellas contiene el método public static void main(String[] args).



Un archivo MANIFEST.MF típico se ve así:



Manifest-Version: 1.0Created-By: 17.0.2 (Oracle Corporation)Main-Class: com.example.Main


La línea más importante aquí es Main-Class. Indica el nombre completo de la clase (con el paquete) que Java debe ejecutar. Si esta línea falta o está incorrecta, obtienes el famoso error «no main manifest attribute».



¿Por qué el manifiesto puede estar vacío o ser incorrecto?



  • Compilación manual con jar — si no especificaste el flag -e o no creaste tu propio manifiesto.
  • Compilación en IDE sin configuración — algunos entornos de desarrollo (especialmente versiones antiguas) no añaden Main-Class automáticamente.
  • Descuido al nombrar — por ejemplo, escribiste main en minúscula u olvidaste especificar el paquete.
  • Codificación y formato — en el manifiesto, cada línea vacía al final del archivo es importante.


Cómo crear un archivo JAR ejecutable: tres métodos



Método 1. Línea de comandos (control manual)



Este método proporciona una comprensión completa del proceso. Supongamos que tenemos una clase simple HelloWorld.java:



package com.example;

public class HelloWorld { public static void main(String[] args) { System.out.println("¡Hola, mundo! ¡El JAR funciona!"); }}


Paso 1. Compilamos la clase

javac -d . HelloWorld.java

El flag -d . crea la estructura de paquetes (com/example/HelloWorld.class).



Paso 2. Creamos el manifiesto manualmente

Creamos un archivo MANIFEST.MF (por ejemplo, en el bloc de notas) con el siguiente contenido:

Manifest-Version: 1.0Main-Class: com.example.HelloWorld

Importante: después de la última línea debe haber una línea vacía. Sin ella, el archivo JAR podría no leer el manifiesto.



Paso 3. Creamos el JAR

jar cfm HelloWorld.jar MANIFEST.MF com/example/HelloWorld.class

El flag

Blogs

Book Recommendations