Solucionado (ver solução)
Solucionado
(ver solução)
10
respostas

Criação do JAR

Estou fazendo da seguinte forma: criei no meu desktop, uma pasta Java. Dentro dela, uma pasta chamada "test", que é o diretório do projeto. Dentro desta, uma pasta "xis", e dentro desta, o arquivo java principal da seguinte forma:

package xis;

public class TesteJar {
    String xx;

    public static void main(String[] args){
        TesteJar x = new TesteJar();
        x.xx = "Hello, world!";
        System.out.println(x.xx);
    }

}

Compilei da seguinte forma:

C:\Users\fw\Desktop\Java\test
javac xis\TesteJar.java

Criei o arquivo Manifest.mf na pasta "test" com o conteúdo:

Manifest-Version: 1.0
Created-By: 1.8.0_101 (Oracle Corporation)
Main-Class: xis.TesteJar

E criei o JAR da seguinte forma:

C:\Users\fw\Desktop\Java\test
jar -cfm TesteJar.jar Manifest.mf test

Mas quando tento executá-lo de duas formas diferentes, recebo um erro:

C:\Users\fw\Desktop\Java\test
java -jar TesteJar.jar
nenhum atributo de manifesto principal em TesteJar.jar

C:\Users\fw\Desktop\Java\test
java -jar TesteJar.jar xis.TesteJar
nenhum atributo de manifesto principal em TesteJar.jar

Qual o problema?

EDIT ---

Consigo executar através de java -cp TesteJar.jar xis.TesteJar mas o intuito não é esse, certo? O correto, segundo o exercício, é fazer o Manifest funcionar sem precisar localizar o path da classe principal.

10 respostas

Olá, Felipe!

O arquivo .jar é um .zip também. Você pode abrir ele como um arquivo compactado e ver o conteúdo dele. Veja se os arquivos estão lá corretamente. Tem de estar o Manifest e os arquivos .class também.

Uma sugestão, tente executar o comando desta forma:

jar -cfm TesteJar.jar Manifest.mf xis/*.class

Tente de novo e veja se funciona.

Olá Arthur, bom dia!

Desculpe por não explanar, mas sim, os arquivos aparecem corretamente (diretório xis, e META-INF com o MANIFEST.MF). A única coisa estranha é que o arquivo MANIFEST.MF não está da forma como criei, apresenta somente as duas primeiras linhas:

Manifest-Version: 1.0
Created-By: 1.8.0_101 (Oracle Corporation)

Ou seja, sem a definição da Main Class, conforme está no meu Manifest.mf:

Manifest-Version: 1.0
Created-By: 1.8.0_101 (Oracle Corporation)
Main-Class: xis.TesteJar

Gerando o JAR da forma proposta(jar -cfm TesteJar.jar Manifest.mf xis/*.class), o mesmo erro ocorre, e o MANIFEST.MF ainda apresenta somente aquelas duas primeiras linhas.

Tente uma coisa: limpe o seu arquivo Manifest.mf e deixe somente a linha do Main-class. Além disso, renomeie o arquivo de .mf para .txt e tente novamente só por curiosidade.

Vou aproveitar para fazer uns testes aqui enquanto isso.

Está ficando divertido hehe. Renomeei para Manifest.txt, deixando somente a linha Main-Class: xis.TesteJar.

Gerei o jar e executei através do comando java -jar TesteJar.jar, e o mesmo erro ocorre nenhum atributo de manifesto principal em TesteJar.jar.

E sempre o mesmo problema: ele gera o jar com o MANIFEST.MF sem a definição da Main-Class.

Felipe,

Testei aqui seguindo os seus passos e funcionou, a única diferença foi que eu fiz o que eu sugeri acima e deixei somente a linha do Main-class. Tirando isso, fiz tudo igual e funcionou.

Inclusive, funcionou tanto com o arquivo Manifest na extensão txt quanto na extensão mf. Ele vai gerar um arquivo mf de qualquer forma.

Esse teste que eu fiz foi do meu Linux. Vou tentar novamente do Windows para garantir.

Revisando a estrutura dos arquivos: estou no diretório test/ e nesta possuo somente o arquivo Manifest.txt, e é onde me encontro na linha de comando executando o comando jar -cfm TesteJar.jar Manifest.mf xis/*.class.

No diretório test/xis/ possuo os arquivos TesteJar.java e a classe compilada TesteJar.class.

Esta estrutura está correta?

solução!

Cara, é um negócio ridículo haha...

No Linux funcionou perfeitamente seguindo seus passos. Fui para o Windows e tive exatamente o mesmo problema que você.

Resolvi ir na documentação (https://docs.oracle.com/javase/tutorial/deployment/jar/build.html) por garantia para ver se tinha algo falando sobre o Windows especificamente e vi essa linha daqui:

Warning: The manifest must end with a new line or carriage return. The last line will not be parsed properly if it does not end with a new line or carriage return.

Por curiosidade, eu dei um enter a mais no arquivo txt do Manifest que fiz, deixando uma linha em branco e gerei novamente o Jar.

Funcionou! Haha. Tenta fazer essa mudança aí.

Acabei de encontrar o mesmo aqui: http://www.skylit.com/javamethods/faqs/createjar.html

Arrancando os cabelos!!! Hehehehe

Muito obrigado pela paciência e dedicação, Arthur! Estou ficando careca, mas mais sabido!

Abração!

Haha! Normal. Os meus não estão caindo (ainda), mas já tenho um monte de fio branco.

O importante é que funcionou!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software