«No main manifest attribute»: por que o Java não vê o ponto de entrada no JAR e como corrigir isso

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Introdução: conhecendo o erro que assusta iniciantes



Você escreveu um programa em Java, compilou, empacotou em um arquivo JAR e, orgulhosamente, tenta executá-lo com um clique duplo — mas, em vez da janela do aplicativo, vê uma janela preta de terminal com a mensagem assustadora: Can't execute jar- file: "no main manifest attribute". Familiar? Se não — considere-se sortudo (por enquanto).



Este erro é um dos mais populares no Stack Overflow. Imagine só: milhares de desenvolvedores, de estudantes a engenheiros experientes, já enfrentaram pelo menos uma vez o fato de seu arquivo JAR "se recusar" a executar. Por que isso acontece? A questão é que Java não é simplesmente "empacote e execute". A máquina virtual precisa saber claramente: qual classe contém o ponto de entrada? Sem essa informação, o arquivo JAR permanece apenas um arquivo comum, não um programa executável.



Neste artigo, vamos entender o que é o manifesto, como ele se relaciona com o ponto de entrada e — o mais importante — como fazer com que seu arquivo JAR seja executado sem erros. Iremos do simples ao complexo: da compilação manual na linha de comando à configuração da IDE. Vamos lá!



O que é o manifesto e para que serve?



Cada arquivo JAR (Java Archive) contém internamente uma pasta META-INF, e dentro dela, o arquivo MANIFEST.MF. Isso não é apenas um artefato técnico, mas sim um verdadeiro "manual de instruções" para a máquina virtual Java.



Imagine um livro sem sumário. Você sabe que ele tem capítulos, mas não sabe em qual página começar a ler. Mais ou menos a mesma coisa acontece com um arquivo JAR sem a indicação da classe principal. A máquina virtual vê várias classes, mas não sabe qual delas contém o método public static void main(String[] args).



Um arquivo MANIFEST.MF típico se parece com isso:



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


A linha mais importante aqui é Main-Class. Ela indica o nome completo da classe (com pacote) que o Java deve executar. Se esta linha estiver ausente ou incorreta — você obtém o famoso erro "no main manifest attribute".



Por que o manifesto pode estar vazio ou incorreto?



  • Compilação manual com jar — se você não usou a flag -e ou não criou seu próprio manifesto.
  • Compilação na IDE sem configuração — alguns ambientes de desenvolvimento (especialmente versões antigas) não adicionam Main-Class automaticamente.
  • Descuido na nomenclatura — por exemplo, você escreveu main com letra minúscula ou esqueceu de especificar o pacote.
  • Codificação e formatação — no manifesto, cada linha em branco no final do arquivo é importante.


Como criar um arquivo JAR executável: três maneiras



Maneira 1. Linha de comando (controle manual)



Este método proporciona uma compreensão total do processo. Suponha que temos uma classe simples HelloWorld.java:



package com.example;

public class HelloWorld { public static void main(String[] args) { System.out.println("Olá, mundo! O JAR está funcionando!"); }}


Passo 1. Compilar a classe

javac -d . HelloWorld.java

A flag -d . cria a estrutura de pacotes (com/example/HelloWorld.class).



Passo 2. Criar o manifesto manualmente

Crie um arquivo MANIFEST.MF (por exemplo, no bloco de notas) com o seguinte conteúdo:

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

Importante: após a última linha, deve haver obrigatoriamente uma linha em branco! Sem ela, o arquivo JAR pode não ler o manifesto.



Passo 3. Criar o JAR

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

A flag

Blogs

Book Recommendations