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.MainLa 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-eo no creaste tu propio manifiesto. - Compilación en IDE sin configuración — algunos entornos de desarrollo (especialmente versiones antiguas) no añaden
Main-Classautomáticamente. - Descuido al nombrar — por ejemplo, escribiste
mainen 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.javaEl 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.HelloWorldImportante: 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.classEl flag
Blogs
Book Recommendations
Leer también
Cómo aprobar una entrevista sobre Rust: las mejores preguntas de la A a la Z
Cómo no ahogarse en espaguetis: Arquitectura Hexagonal en C#
Monitoreo y registro de aplicaciones TypeScript: guía completa
Cómo obtener el año actual en PHP: guía completa con ejemplos
Expresiones regulares en Java con ejemplos: para principiantes