Eu instalei um aplicativo, quando tento executá-lo (é um jar executável), nada acontece. Quando eu o executo na linha de comando com:
java -jar "app.jar"
Recebo a seguinte mensagem:
nenhum atributo principal do manifesto, em "app.jar"
Normalmente, se eu mesmo tivesse criado o programa, teria adicionado um atributo de classe principal ao arquivo de manifesto. Mas, neste caso, como o arquivo é de um aplicativo, não posso fazer isso. Também tentei extrair o jar para ver se conseguia encontrar a classe principal, mas existem muitas classes e nenhuma delas tem a palavra "main" em seu nome. Deve haver uma maneira de corrigir isso, porque o programa funciona bem em outros sistemas.
javap
. Você pode descompactá-lo e verificar se realmente não há manifesto.Respostas:
Primeiro, é meio estranho ver você correr
java -jar "app"
e nãojava -jar app.jar
Segundo, para tornar um jar executável ... você precisa jarar um arquivo chamado META-INF / MANIFEST.MF
o próprio arquivo deve ter (pelo menos) este liner:
Onde
com.mypackage.MyClass
está a classe que contém o ponto de entrada público estático void main (String [] args) .Observe que existem várias maneiras de fazer isso com o CLI, Maven, Ant ou Gradle:
Para a CLI , o seguinte comando fará: (tks @ dvvrt )
jar cmvf META-INF/MANIFEST.MF <new-jar-filename>.jar <files to include>
Para Maven , algo como o seguinte trecho deve fazer o truque. Observe que esta é apenas a definição do plug-in, não o pom.xml completo :
(Escolha um
<version>
apropriado para o seu projeto.)Para Ant , o snippet abaixo deve ajudar:
Créditos Michael Niemand -
Para Gradle :
fonte
lib
pasta, você só precisa executar o jar comjava -jar myproject.jar
e ele encontrará as dependências.jar cmvf META-INF/MANIFEST.MF <new-jar-filename>.jar <files to include>
maven-jar-plugin
item no arquivo Maven gerado pelo VSC, então acabei de adicionar a<configuration>
seção a ele.Isso deveria ter sido em
java -jar app.jar
vez dejava -jar "app"
.A
-jar
opção funciona apenas se o arquivo JAR for um arquivo JAR executável, o que significa que ele deve ter um arquivo de manifesto com umMain-Class
atributo nele. Consulte Empacotando programas em arquivos JAR para saber como criar um JAR executável.Se não for um JAR executável, será necessário executar o programa com algo como:
Onde
com.somepackage.SomeClass
é a classe que contém omain
método para executar o programa. (O que essa classe depende do programa, é impossível saber das informações que você forneceu).fonte
META-INF
diretório dentro do arquivo JAR). Ele deve conter umMain-Class
atributo que fornece o nome da classe principal.Como alternativa, você pode usar o maven-assembly-plugin, conforme mostrado no exemplo abaixo:
Neste exemplo, todos os jars de dependência, conforme especificado na seção, serão automaticamente incluídos no seu jar único. Observe que jar-with-dependencies deve ser literalmente colocado como, para não ser substituído pelos nomes dos arquivos jar que você deseja incluir.
fonte
maven-assembly-plugin
funcionou.maven-jar-plugin
nao fiz.pom.xml
arquivo<build><plugins> PUT IT HERE </plugins></build>
e execute o maven Package (no menu aberto do IDEA open maven deslizante à direita, procure projeto> Lifecycle> package). Em seguida, seu arquivo jar estará na pasta Target. Felicidades!Isso ocorre porque o Java não pode encontrar o atributo Main no arquivo MANIFEST.MF. O atributo Main é necessário para informar ao java qual classe ele deve usar como ponto de entrada do aplicativo. Dentro do arquivo jar, o arquivo MANIFEST.MF está localizado na pasta META-INF. Quer saber como você pode ver o que há dentro de um arquivo jar? Abra o arquivo jar com o WinRAR.
O atributo principal dentro do MANIFEST.MF é parecido com este:
Você recebe esse erro "nenhum atributo de manifesto principal" quando esta linha está ausente no arquivo MANIFEST.MF.
É realmente uma bagunça enorme especificar esse atributo dentro do arquivo MANIFEST.MF.Atualização: Acabei de encontrar uma maneira realmente elegante de especificar o ponto de entrada do aplicativo no eclipse. Quando você diz Exportar,
fonte
Eu tive o mesmo problema. adicionando as seguintes linhas ao arquivo pom fez com que funcionasse. O plugin garantirá o processo de criação do seu aplicativo com todas as etapas necessárias.
fonte
<parent>...</parent>
aplicativo no pom.xml. Meu palpite é que, se visitarmos oparent
pom.xml do aplicativo, teremos uma ideia clara.repackage-classifier
. Visite docs.spring.io/spring-boot/docs/2.2.0.RELEASE/maven-plugin/…A resposta do Gradle é adicionar uma configuração jar / manifest / attribute como esta:
fonte
Eu tive esse problema ao criar um jar usando o IntelliJ IDEA. Veja esta discussão .
O que resolveu para mim foi recriar o artefato jar, escolhendo JAR> Dos módulos com dependências, mas não aceitando o Diretório padrão para META-INF / MANIFEST.MF. Altere-o de - / src / main / java para - / src / main / resources.
Caso contrário, estava incluindo um arquivo de manifesto no jar, mas não o arquivo - / src / main / java que deveria ter.
fonte
Para o maven, foi isso que o resolveu (para mim, para uma base de código Veetle no GitHub):
Felicidades...
fonte
mvn package shade:shade
apenas a execuçãomvn package
não acionava o plug-in de sombra.Tente este comando para incluir o jar:
fonte
Para mim, nenhuma das respostas realmente ajudou - eu tinha o arquivo de manifesto no lugar correto, contendo a classe principal e tudo. O que me tropeçou foi isso:
( fonte ). A adição de uma nova linha no final do manifesto foi corrigida.
fonte
Se estiver usando o Maven, inclua o seguinte no pom
fonte
no main manifest attribute
erro, mas estou trabalhando no aplicativo de inicialização da primavera, então essa resposta me ajudou. Eu já sabia como criarMETA-INF/MANIFEST.MF
arquivo, mas não como fazer o boot por mola lida automaticamente com ele.spring-boot
ignore-o. O Stackoverflow também ajuda a criar seu próprio repositório de problemas que você enfrenta durante a programação.Eu tive o mesmo problema hoje. Meu problema foi resolvido ao mover o META-INF para a pasta de recursos.
fonte
Eu tenho o mesmo erro agora. Se você estiver usando
gradle
, basta adicionar o próximo em urgradle.build
:Onde
com.company.project.MainClass
caminho para sua classe com opublic static void main(String[] args)
métodofonte
mainClassName
conjunto de variáveis, mas isso só ajuda comgradle run
comando, não com a criação de um .jar executávelO problema MAVEN é que ele tenta incluir o primeiro arquivo MANIFEST.MF da primeira biblioteca de dependências, em vez de NOSSO PRÓPRIO MANIFEST.MF ao usar artefatos! .
Copie o MANIFEST.MF real que já gera em seu projeto por MAVEN. Isso inclui alguns que:
Versão do manifesto: 1.0 Classe principal: yourpacket.yourmainclass (por exemplo, info.data.MainClass)
Substitua o conteúdo do MANIFEST.MF do youjar.zip por ele.
OU!
Simples crie seu próprio MANIFEST.MF e:
Mas se você usar o painel maven (ou linha de comando maven), poderá forçá-lo a gerar seu próprio manifesto e incluí-lo no arquivo JAR.
Adicione à seção de compilação do you pom.xml este código:
Abra o painel MAVEN (no Intellij) e execute "Install". Ele irá gerar o arquivo MANIFEST e compilar a propriedade JAR com todas as dependências na pasta "Destino". Também será instalado no repositório maven local.
fonte
Se o jar não estiver seguindo as regras , não será um jar executável.
fonte
Eu enfrentei o mesmo problema e ele foi corrigido agora :) Basta seguir as etapas abaixo e o erro pode ser qualquer coisa, mas as etapas abaixo tornam o processo mais suave. Passo muito tempo para encontrar a solução.
1.Tente reiniciar o Eclipse (se você estiver usando o Eclipse para criar o arquivo JAR) -> Na verdade, isso ajudou meu problema ao exportar o arquivo JAR corretamente.
2. Após a reinicialização do eclipse, tente ver se o seu eclipse é capaz de reconhecer a classe / método principal pelo seu projeto Java -> clique com o botão direito do mouse -> Executar como -> Executar configurações -> Principal -> clique no botão Pesquisar para ver se o seu eclipse é capaz de procurar sua classe principal no arquivo JAR. -> Isto é para a validação de que o arquivo JAR terá o ponto de entrada para a classe principal.
Depois disso, exporte seu projeto Java Dynamic como arquivo "JAR executável" e não como arquivo JAR.
Na configuração de ativação do Java, escolha sua classe principal.
Depois de exportar o arquivo jar, use o comando abaixo para executar. java -cp [Seu JAR] .jar [pacote completo] .MainClass, por exemplo: java -cp AppleTCRuleAudit.jar com.apple.tcruleaudit.classes.TCRuleAudit
Você pode enfrentar o erro de versão java não suportado. a correção é alterar o java_home no perfil do shell bash para corresponder à versão java usada para compilar o projeto no eclipse.
Espero que isto ajude! Por favor, deixe-me saber se você ainda tem algum problema.
fonte
Eu tive o mesmo problema. Muitas das soluções mencionadas aqui não me deram a imagem completa, então tentarei dar um resumo de como compactar arquivos jar na linha de comando .
Se você deseja ter seus
.class
arquivos em pacotes, adicione o pacote no início do.java
.Test.java
Para compilar seu código com os
.class
arquivos que terminam com a estrutura fornecida pelo nome do pacote, use:Isso
-d .
faz com que o compilador crie a estrutura de diretórios desejada.Ao empacotar o
.jar
arquivo, você precisa instruir a rotina jar sobre como empacotá-lo. Aqui usamos o conjunto de opçõescvfeP
. Isso é para manter a estrutura do pacote (opçãoP
), especifique o ponto de entrada para que o arquivo de manifesto contenha informações significativas (opçãoe
). Optionf
permite especificar o nome do arquivo, a opçãoc
cria um archive e a opçãov
define a saída como detalhada. As coisas importantes a serem observadas aqui sãoP
ee
.Depois vem o nome do frasco que queremos
test.jar
.Então vem o ponto de entrada.
E então chega
-C . <packagename>/
para obter os arquivos de classe dessa pasta, preservando a estrutura da pasta.Verifique seu
.jar
arquivo em um programa zip. Deve ter a seguinte estruturatest.jar
O MANIFEST.MF deve conter o seguinte
Se você editar seu manifesto manualmente, mantenha a nova linha no final, caso contrário, o java não o reconhecerá.
Execute seu
.jar
arquivo comfonte
Pessoalmente, acho que todas as respostas aqui entendem mal a pergunta. A resposta para isso está na diferença de como o spring-boot cria o .jar. Todo mundo sabe que o Spring Boot configura um manifesto como este, que varia de todos os pressupostos de que este é um lançamento .jar padrão, que pode ou não ser:
Talvez ele precise ser executado
org.springframework.boot.loader.JarLauncher
no caminho de classe?fonte
Qualquer arquivo jar executável deve ser executado clicando ou executando usando o prompt de comando como java -jar app.jar (use "se o caminho da jar contiver espaço" - ou seja, java -jar "C: \ nome da pasta \ app.jar"). Se o seu jar executável não estiver em execução, significa que ele não foi criado corretamente.
Para uma melhor compreensão, extraia o arquivo jar (ou visualize usando qualquer ferramenta, pois o Windows 7-Zip é bom) e verifique o arquivo em /META-INF/MANIFEST.MF. Se você encontrar alguma entrada como
Classe principal: your.package.name.ClaaswithMain - então tudo bem, caso contrário você precisará fornecê-lo.
Esteja ciente de anexar a entrada da classe principal no arquivo MANIFEST.MF, verifique onde está salvando!
fonte
Você pode simplesmente seguir esta etapa Crie um arquivo jar usando
Ao executar o arquivo jar, execute simples assim
fonte
Você pode não ter criado o arquivo jar corretamente:
Os seguintes trabalhos:
fonte
Se você estiver usando a linha de comando para montar .jar, é possível apontar para o principal sem adicionar o arquivo Manifest. Exemplo:
(param "e" faz isso: TheNameOfClassWithMainMethod é um nome da classe com o método main () e app.jar - nome do executável .jar e * .class - apenas todos os arquivos de classe para montar)
fonte
Para mim, esse erro ocorreu simplesmente porque eu esqueci de dizer ao Eclipse que queria um arquivo jar executável e não um arquivo jar de biblioteca simples. Portanto, ao criar o arquivo jar no Eclipse, clique no botão de opção direito
fonte
As respostas acima foram apenas parcialmente úteis para mim.
java -cp
fazia parte da resposta, mas eu precisava de informações mais específicas sobre como identificar a classe a ser executada. Aqui está o que funcionou para mim:Etapa 1: encontre a classe que preciso executar
As principais linhas do resultado foram:
App.class continha a classe principal a ser executada. Não tenho 100% de certeza se você sempre pode assumir que a turma de que precisa é a primeira, mas foi para mim. Se não for, imagino que não seja muito difícil usar grep para excluir resultados relacionados à biblioteca para reduzir a lista de classes a um tamanho gerenciável.
A partir daí, foi fácil: eu apenas uso esse caminho (menos o sufixo ".class"):
fonte
java -cp ... somepackage.App
.Desde que você adicionou MANIFEST.MF, acho que você deve considerar a ordem do campo neste arquivo. Meu env é
java version "1.8.0_91"
e meu MANIFEST.MF como aqui
No entanto, isso como mostrado abaixo
fonte
(primeiro post - pode não estar limpo)
Esta é minha correção para o programa Netbeans 8.2 baseado em Maven, OS X 11.6. Até agora, meu aplicativo é 100% Netbeans - sem alterações (apenas alguns shell escapam para o impossível!).
Tendo tentado quase todas as respostas aqui e em outros lugares sem sucesso, voltei à arte de "usar o que funciona".
A resposta principal aqui ( olivier-refalo thanx) parecia o lugar certo para começar, mas não ajudou.
Olhando para outros projetos que funcionaram, notei algumas pequenas diferenças nas linhas do manifesto:
Não sei por que (eu tenho apenas 3 meses em java) ou como, mas só posso dizer que isso funcionou.
Aqui está apenas o bloco de manifesto modificado usado:
fonte
Encontrei uma nova solução para geração de manifesto ruim!
Clique para META-INF
Adicionar ou editar
Adicionar:
Crie um arquivo de texto chamado MANIFEST.MF em uma pasta chamada META-INF e adicione a seguinte linha:
Salve o arquivo e adicione-o ao zip
Editar:
Abra o cmd e digite: java -jar c: /path/JarName.jar
Deve funcionar bem agora!
fonte
a maioria das soluções não funcionou para mim, mas meu instrutor me ajudou, gostaria de compartilhar sua solução aqui, usei o terminal kali linux, mas deve estar bem em todos
no tipo de arquivo
agora para executar o arquivo use
ou você pode acessar as propriedades do arquivo e verificar
me ajudou enquanto a maioria das respostas acima não
fonte
Você pode ter o mesmo problema que eu. Após criar seu arquivo .jar, escreva
jar xf app.jar META-INF/MANIFEST.MF
. Isso criará uma cópia do arquivo no diretório atual para que você possa lê-lo. Se apenas diz algo como:e não contém a declaração "Main-Class", acho que você encontrou o seu problema.
Eu não sei como resolvê-lo, no entanto. Eu verifiquei outras pessoas com problemas iguais / semelhantes no StackOverflow e não consegui encontrar uma resposta. No entanto, com essas informações, talvez você possa obter uma ajuda melhor (considerando que você tem o mesmo problema que eu).
Edit: Eu tentei com um arquivo de manifesto, mas não o fiz funcionar, mas meu erro foi nomear apenas uma das classes ao criar o arquivo jar. Eu escrevi * .class e agora funciona.
Embora eu não saiba por que é necessário criar um arquivo de manifesto. Mas acho que está tudo bem, desde que funcione.
fonte
Eu tive esse problema e o resolvi recentemente, fazendo isso no Netbeans 8 (consulte a imagem abaixo):
fonte