Por que não conseguiu carregar o atributo de manifesto da classe principal de um arquivo JAR?

85

Eu criei um arquivo JAR dessa forma jar cf jar-file input-files. Agora, estou tentando executá-lo. Executá-lo não funciona (o comando jre não foi encontrado):

jre -cp app.jar MainClass

Isso também não funciona:

java -jar main.jar

(Falha ao carregar o atributo de manifesto da classe principal de main.jar).

Eu também descobri que

Para executar um aplicativo empacotado como um arquivo JAR (versão 1.2 - requer cabeçalho de manifesto Main-Class)

O que é o "cabeçalho do manifesto da classe principal"? Como faço para criá-lo e onde colocá-lo?

romano
fonte

Respostas:

62

Não tenho certeza se acredito nos seus sintomas:

  • Se o jrecomando não for encontrado, a execução jre -cp app.jardeve dar o mesmo erro
  • Apenas adicionar um arquivo JAR ao classpath não deve dar o erro que você está vendo

Espero que você veja este erro se executar:

java -jar app.jar

O cabeçalho da classe principal precisa estar no manifesto do arquivo JAR - são metadados sobre coisas como outras bibliotecas necessárias. Consulte a documentação da Sun para saber como criar um manifesto apropriado. Basicamente, você precisa criar um arquivo de texto que inclua uma linha como esta:

Main-Class: MainClass

Então corra

jar cfm app.jar manifest.txt *.class
Jon Skeet
fonte
Obrigado. Funciona. Criei um arquivo de manifesto com o Main-Class: MainClasse, em seguida, criei o arquivo .jar com o comando que você forneceu. Depois disso, consegui executar meu programa java -jar main.jar.
Romano,
1
Outra opção é usar a opção -e, sem a necessidade de um arquivo separado. jar cfe app.jar MainClass *.classObservação: -e foi adicionado no JDK 6.
válido em
35
  1. definir o classpath e compilar

    javac -classpath "C: \ Arquivos de programas \ Java \ jdk1.6.0_ updateVersion \ tools.jar" yourApp.java

  2. create manifest.txt

    Classe principal: newline do seu aplicativo

  3. crie seuApp.jar

    jar cvf0m yourApp.jar manifest.txt yourApp.class

  4. execute yourApp.jar

    java -jar yourApp.jar

weirdFactory
fonte
9

Você pode correr com:

java -cp .;app.jar package.MainClass

Funciona para mim se não houver manifesto no arquivo JAR.

Dainius
fonte
I've: Opção não reconhecida: -cp. Você poderia revisar sua resposta? Porque eu não sei o que este comando está tentando fazer. (java -cp.; app.jar package.MainClass). Este é um comando ou dois?
Kenorb
1
docs.oracle.com/javase/1.5.0/docs/tooldocs/windows/… "-cp.; app.jar" deve adicionar seu arquivo app.jar ao caminho de classe, então você pode executar o método MainClass.main () ( MainClass está no pacote "pacote").
Dainius
1
Portanto, provavelmente no Linux esta opção (-cp) não existe (o meu é java v1.6.0_24, OpenJDK Runtime Environment (IcedTea6 1.11.3) (6b24-1.11.3-1ubuntu0.12.04.1)).
Kenorb,
java -version => Java HotSpot (TM) Servidor VM de 64 bits (build 20.1-b02, modo misto) "java -cp. test1.Main" funciona
Dainius
/ usr / lib / jvm / java-6-openjdk-amd64 / bin / java -version => OpenJDK 64-Bit Server VM (build 20.0-b12, modo misto) "/ usr / lib / jvm / java-6-openjdk -amd64 / bin / java -cp. test1.Main "funciona
Dainius
6

Recebi este erro, porque os argumentos estavam na ordem errada:

CORRIGIR

java maui.main.Examples tagging -jar maui-1.0.jar 

ERRADO

java -jar maui-1.0.jar maui.main.Examples tagging 
Sridhar Sarnobat
fonte
1
Isso pode ser apenas um problema de bsd, tenho certeza de que fiz isso de outra forma recentemente.
Sridhar Sarnobat
1

A maneira mais fácil de ter certeza de que criou o arquivo JAR executável corretamente, com o arquivo de manifesto apropriado, é usar o Eclipse para construí-lo para você. Em seu projeto Eclipse, você basicamente apenas seleciona Arquivo / Exportar no menu e segue os prompts.

Dessa forma, você pode ter certeza de que seu arquivo JAR está correto e saberá procurar em outro lugar se ainda houver um problema. O processo é descrito na íntegra nas Perguntas frequentes. Como faço para criar um arquivo JAR executável para um programa SWT independente? .

Greg Burdett
fonte
Obrigado por Exportno Eclipse IDE.
Ninh Pham de
1

Experimentar

java -cp .:mail-1.4.1.jar JavaxMailHTML 

não há necessidade de ter manifestarquivo.

user4581964
fonte
0

Descobri que também estava tendo esse erro no NetBeans. Espero que o seguinte seja útil.

  1. Certifique-se de que, ao ir para Configuração do projeto, você definiu a classe principal que pretende executar.
  2. Faça um Build ou Clean Build
  3. Coloque o arquivo jar onde desejar e tente: java -jar "YourProject.jar" novamente na linha de comando.

Este era o problema que eu estava tendo porque eu tinha outros programas de "teste" que estava usando no NetBeans e precisava ter certeza de que a classe principal na parte Executar da configuração do projeto estava definida corretamente.

muitas bênçãos, John P

john p
fonte
0

Eu estava recebendo o mesmo erro quando executei:
jar cvfm test.jar Test.class Manifest.txt

O que resolveu foi o seguinte:
jar cvfm test.jar Manifest.txt Test.class

Meu manifesto tem o ponto de entrada conforme fornecido nos documentos do oracle (certifique-se de que haja um novo caractere de linha no final do arquivo):
Main-Class: Test

ObviousChild
fonte
0

Eu enfrentei o mesmo problema. Este comando unix não consegue encontrar a classe principal. Isso ocorre porque as versões do JDK em tempo de execução e tempo de compilação são diferentes. Faça o jar através do eclipse após alterar a versão do compilador java. O link a seguir me ajudou.

http://crunchify.com/exception-in-thread-main-java-lang-unsupportedclassversionerror-comcrunchifymain-unsupported-major-minor-version-51-0/

Tente executar o jar criado após esta etapa e, em seguida, execute-o

Harshita Sethi
fonte
0

Se o caminho da sua classe estiver totalmente especificado no manifesto, talvez você precise da última versão do ambiente de execução java. Meu problema foi corrigido quando reinstalei o jre 8.

AmirHossein Rezaei
fonte
0

Se você estiver usando o eclipse, tente abaixo: 1. Clique com o botão direito do mouse no projeto -> selecione Exportar 2. Selecione o arquivo Jar executável em selecionar um destino de exportação 3. Insira o nome do jar e selecione "Pacote necessário ..." (segundo botão de opção) -> Terminar

Espero que isto ajude...!

Barani r
fonte