Meu programa java é empacotado em um arquivo jar e faz uso de uma biblioteca jar externa, o castelo insuflável . Meu código compila bem, mas a execução do jar leva ao seguinte erro:
Exceção no encadeamento "main" java.lang.SecurityException: resumo do arquivo de assinatura inválido para os principais atributos do Manifest
Pesquisei por mais de uma hora pesquisando uma explicação e encontrei muito pouco valor. Se alguém já viu esse erro antes e pudesse oferecer alguma ajuda, eu seria obrigado.
Respostas:
A solução listada aqui pode fornecer um ponteiro.
Bottom line:
fonte
Para aqueles que receberam esse erro ao tentar criar um uber-jar com
maven-shade-plugin
, a solução é excluir arquivos de assinatura de manifesto adicionando as seguintes linhas à configuração do plug-in:fonte
Para aqueles que usam gradle e tentam criar e usar um frasco de gordura, a seguinte sintaxe pode ajudar.
fonte
exclude
minhafatJar
tarefa, que tinha esseconfigurations.compile.collect
comando. Veja stackoverflow.com/a/31426413/103412Error: Could not find or load main class App Caused by: java.lang.ClassNotFoundException: App
Algumas de suas dependências provavelmente são jarfiles assinados. Quando você combina todos eles em um grande jarfile, os arquivos de assinatura correspondentes ainda estão presentes e não correspondem mais ao jarfile "grande combinado"; portanto, o tempo de execução pára de pensar que o arquivo jar foi violado (o que ... falar).
Você pode resolver o problema eliminando os arquivos de assinatura das suas dependências do jarfile. Infelizmente, não é possível fazer isso em uma única etapa no form .
No entanto, consegui fazer isso funcionar com o Ant em duas etapas, sem nomear especificamente cada dependência do jarfile, usando:
O elemento sleep deve evitar erros sobre arquivos com datas de modificação no futuro .
Outras variações que encontrei nos threads vinculados não funcionaram para mim.
fonte
Por favor, use o seguinte comando
fonte
Eu tive esse problema ao usar o IntelliJ IDEA 14.01.
Consegui corrigi-lo da seguinte maneira:
Arquivo-> Estrutura do Projeto-> Adicionar Novo (Artefatos) -> jar-> Dos Módulos com Dependências na Janela Criar Jar do Módulo:
Selecione sua classe principal
Arquivo JAR das Bibliotecas Selecione copiar para o diretório de saída e vincular através do manifesto
fonte
A segurança já é um tópico difícil, mas estou desapontado ao ver que a solução mais popular é excluir as assinaturas de segurança. O JCE requer essas assinaturas . A sombra Maven explode o arquivo jar do BouncyCastle que coloca as assinaturas no META-INF, mas as assinaturas do BouncyCastle não são válidas para um novo uber-jar (apenas para o jar BC), e é isso que causa o erro de assinatura inválida neste encadeamento .
Sim, excluir ou excluir as assinaturas, conforme sugerido por @ruhsuzbaykus, faz com que o erro original desapareça, mas também pode levar a novos erros enigmáticos:
Especificando explicitamente onde encontrar o algoritmo como este:
Consegui receber um erro diferente:
A JCE não pode autenticar o provedor porque excluímos as assinaturas criptográficas seguindo a sugestão em outra parte desse mesmo encadeamento .
A solução que encontrei foi o plug-in empacotador executável que usa uma abordagem jar-in-jar para preservar a assinatura BouncyCastle em um único jar executável.
ATUALIZAR :
Outra maneira de fazer isso (da maneira correta?) É usar o assinante Maven Jar . Isso permite que você continue usando o tom Maven sem obter erros de segurança. No entanto, você deve ter um certificado de assinatura de código (a Oracle sugere procurar por "Certificado de assinatura de código Java"). A configuração do POM é assim:
Não, não há como fazer com que a JCE reconheça um certificado autoassinado; portanto, se você precisar preservar os certificados BouncyCastle, precisará usar o plug-in jar-in-jar ou obter um certificado JCE.
fonte
Eu enfrentei o mesmo problema, após referência em algum lugar, funcionou da seguinte forma:
fonte
maven-shade-plugin
tag.Supondo que você construa seu arquivo jar com o ant, basta instruir o ant para deixar de fora o diretório META-INF. Esta é uma versão simplificada do meu alvo formiga:
fonte
Recentemente, comecei a usar o IntelliJ em meus projetos. No entanto, alguns de meus colegas ainda usam o Eclipse nos mesmos projetos. Hoje, tenho o mesmo erro depois de executar o arquivo jar criado pelo meu IntelliJ. Enquanto todas as soluções aqui falando sobre quase a mesma coisa, nenhuma delas funcionou para mim com facilidade (possivelmente porque eu não uso o ANT, o maven build me deu outros erros que me indicaram http://cwiki.apache.org/ confluência / tela / MAVEN / MojoExecutionException e também não consegui descobrir quais são os frascos assinados por mim!)
Finalmente, isso me ajudou
Adivinha o que foi removido do meu arquivo jar ?!
Parece que o problema foi relevante para alguns arquivos relevantes para o eclipse.
fonte
Eu tive o mesmo problema
gradle
ao criar um Jar gordo, atualizando obuild.gradle
arquivo com uma linha de exclusão corrigida.fonte
Caso você esteja usando o gradle, aqui está uma tarefa completa do farJar:
fonte
Compare a pasta META-INF no novo jar com o jar antigo (antes de adicionar novas bibliotecas). É possível que haja novos arquivos. Se sim, você pode removê-los. Deveria ajudar. Atenciosamente, 999michal
fonte
Uma estratégia consistiria em usar o ANT para simplificar a remoção da assinatura de cada arquivo Jar. Ele continuaria com as seguintes etapas:
Aqui está um macrodef ANT fazendo o trabalho:
`
A definição pode ser chamada dessa maneira em uma tarefa ANT:
fonte
O que me ajudou (IntelliJ IDEA 2016.3): Arquivo -> Estrutura do projeto -> Artefatos -> Adicionar JAR -> Selecionar classe principal -> Escolha "copiar para o diretório de saída e vincular via manifesto" -> OK -> Aplicar -> Construir - > Criar artefatos ... -> Criar
fonte
É possível que dois signatários diferentes atrapalhem a mente do java.
Tente remover a pasta META-INF do jar, adicionar manifesto e assinar o JAR novamente. Isso me ajudou: http://jehy.ru/articles/2013/12/13/invalid-signature-file-digest-for-manifest-main- atributos/
fonte
Se você está procurando uma solução Fat JAR sem descompactar ou adulterar as bibliotecas originais, mas com um carregador de classes JAR especial, dê uma olhada no meu projeto aqui .
Isenção de responsabilidade: não escrevi o código, apenas o empacote e publique no Maven Central e descreva no meu leia-me como usá-lo.
Eu pessoalmente o uso para criar JARs uber executáveis que contêm dependências do BouncyCastle. Talvez seja útil para você também.
fonte
Para aqueles que têm problemas com a solução aceita, há outra maneira de excluir recursos do jar sombreado com o DontIncludeResourceTransformer:
https://maven.apache.org/plugins/maven-shade-plugin/examples/resource-transformers.html#DontIncludeResourceTransformer
Do Shade 3.0, esse transformador aceita uma lista de recursos. Antes disso, você só precisa usar vários transformadores, cada um com um recurso.
fonte
Isso aconteceu comigo no Intellij quando cliquei em "Adicionar como projeto Maven" na linha inferior quando o Intellij disse "arquivos pom não gerenciados encontrados". Enquanto isso, a pasta já foi gerada. Portanto, não obteve alterações recentes.
Excluir a pasta e executar o programa resolveu o problema para mim. A pasta de saída foi recriada.
Veja a resposta de Little Fox também. O erro que recebi foi muito semelhante ao dele.
fonte
Eu tive um problema parecido. O motivo foi que eu estava compilando usando um JDK com um JRE diferente do padrão na minha caixa do Windows.
Usar o java.exe correto resolveu meu problema.
fonte
Se você estiver obtendo isso ao tentar vincular arquivos JAR para um projeto de ligações do Xamarin.Android, assim:
Basta abrir os arquivos JAR usando o Winzip e excluir os diretórios meta-inf. Reconstruir - trabalho concluído
fonte