A implantação do projeto Maven lança java.util.zip.ZipException: cabeçalho LOC inválido (assinatura incorreta)

164

Estou recebendo a exceção abaixo quando executo o meu mvn install. Eu até apaguei o repositório local e executei novamente obtendo a mesma exceção.

[ERRO] Falha ao executar a meta org.apache.maven.plugins: maven-shade-plugin: 2.1: shade (padrão) no lote de núcleos do projeto: Erro ao criar frasco sombreado: cabeçalho sombreado: cabeçalho LOC inválido (assinatura incorreta) -> [Ajuda 1 ]

<?xml version="1.0" encoding="UTF-8"?>
<plugin>
   <groupId>org.apache.maven.plugins</groupId>
   <artifactId>maven-shade-plugin</artifactId>
   <version>2.1</version>
   <configuration>
      <skipTests>true</skipTests>
   </configuration>
   <executions>
      <execution>
         <phase>package</phase>
         <goals>
            <goal>shade</goal>
         </goals>
         <configuration>
            <artifactSet>
               <excludes>
                  <exclude>commons-logging:commons-logging:jar:*</exclude>
               </excludes>
            </artifactSet>
            <filters>
               <filter>
                  <artifact>*:*</artifact>
                  <excludes>
                     <!-- workaround for a spring issues -->
                     <exclude>META-INF/*.SF</exclude>
                     <exclude>META-INF/*.DSA</exclude>
                     <exclude>META-INF/*.RSA</exclude>
                     <!-- don't want to pick up any other log4j.xml -->
                     <exclude>log4j.xml</exclude>
                  </excludes>
               </filter>
            </filters>
            <!-- May be needed to work around another issue in Spring -->
            <transformers>
               <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
                  <resource>META-INF/spring.handlers</resource>
               </transformer>
               <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
                  <resource>META-INF/spring.schemas</resource>
               </transformer>
            </transformers>
         </configuration>
      </execution>
   </executions>
</plugin>

Erro:

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-shade-plugin:2.1:shade (default) on project cores-batch: Error creating shaded jar: invalid LOC header (bad signature) -> [Help 1]
org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute goal org.apache.maven.plugins:maven-shade-plugin:2.1:shade (default) on project cores-batch: Error creating shaded jar: invalid LOC header (bad signature)
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:217)
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:153)
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:145)
    at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:84)
    at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:59)
    at org.apache.maven.lifecycle.internal.LifecycleStarter.singleThreadedBuild(LifecycleStarter.java:183)
    at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:161)
    at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:320)
    at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:156)
    at org.apache.maven.cli.MavenCli.execute(MavenCli.java:537)
    at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:196)
    at org.apache.maven.cli.MavenCli.main(MavenCli.java:141)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:290)
    at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:230)
    at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:409)
    at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:352)
Caused by: org.apache.maven.plugin.MojoExecutionException: Error creating shaded jar: invalid LOC header (bad signature)
    at org.apache.maven.plugins.shade.mojo.ShadeMojo.execute(ShadeMojo.java:528)
    at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:101)
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:209)
    ... 19 more
Caused by: java.util.zip.ZipException: invalid LOC header (bad signature)
    at java.util.zip.ZipFile.read(Native Method)
    at java.util.zip.ZipFile.access$1400(ZipFile.java:56)
    at java.util.zip.ZipFile$ZipFileInputStream.read(ZipFile.java:679)
    at java.util.zip.ZipFile$ZipFileInflaterInputStream.fill(ZipFile.java:415)
    at java.util.zip.InflaterInputStream.read(InflaterInputStream.java:158)
    at java.io.FilterInputStream.read(FilterInputStream.java:107)
    at org.codehaus.plexus.util.IOUtil.copy(IOUtil.java:189)
    at org.codehaus.plexus.util.IOUtil.copy(IOUtil.java:175)
    at org.apache.maven.plugins.shade.DefaultShader.addResource(DefaultShader.java:427)
    at org.apache.maven.plugins.shade.DefaultShader.shade(DefaultShader.java:186)
    at org.apache.maven.plugins.shade.mojo.ShadeMojo.execute(ShadeMojo.java:458)
    ... 21 more
[ERROR] 
[ERROR] 
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException
Karthick
fonte
1
Criou um plugin para este problema -> github.com/goxr3plus/CorruptedJarsDetector
GOXR3PLUS 11/11
1
@ GOXR3PLUS Não existe realmente um código nesse repositório (exceto para a classe no README), ainda menos que o de um plug-in Maven. Eu acho que uma Maven plug-in seria a melhor solução, na verdade - ou apenas uma extensão de um dos plugins existentes que permitiu fazer algo parecido com um mvn dependencies validateou assim ...
Marco13
Marco o código para o repositório é aquele em lol classe :)
GOXR3PLUS

Respostas:

79

Você precisa verificar qual jar está dando problema. Ele deve estar corrompido. Exclua esse jar e execute o mvn spring-boot:runcomando novamente. Pode haver mais que um jar foi corrompido, portanto, toda vez que você precisar executar esse comando para excluir esse jar. No meu caso, mysql, jackson, jars de aspecto foi corrompido mvn spring-boot:run3 vezes e eu descobri isso e apaguei os jars da .m2pasta. Agora o problema foi resolvido.

alok
fonte
218

O arquivo jar pode estar corrompido. Tente remover o conteúdo da seguinte pasta:

 C:\Users\[username]\.m2\repository

Em seguida, clique com o botão direito do mouse no seu projeto, selecione Maven, Atualizar Projeto, verifique Forçar Atualização de Instantâneos / Liberações.

Siva Anand
fonte
4
Isso deve ser marcado como a solução. Eu acredito que é também a solução para várias outras questões relacionadas que não têm respostas. Obrigado Siva!
Hack-R
1
muito bom .. depois de passar 7 horas eu descobri a solução ... KUDOS para você homem ....
Sufiyan Ansari
4
Isso funciona, mas excluir todo o repositório local maven não é a melhor opção. Apenas exclua os arquivos jar relacionados e isso é suficiente.
Levent Divilioglu
2
Não é necessário excluir todas as dependências; no topo, você pode descobrir quais dependências possuem um cabeçalho LOC incorreto.
Umar faraz 06/04/19
2
Apenas para observar o óbvio: quando alguém se depara invalid LOC headerno Gradle build, você simplesmente exclui a ~/.gradle/cachespasta (Linux).
Martin Vseticka
110

O principal problema são os frascos corrompidos.

Para localizar o corrompido, você precisa adicionar um ponto de interrupção de exceção Java na exibição de pontos de interrupção do Eclipse ou seu IDE preferido, selecionar a java.util.zip.ZipExceptionclasse e reiniciar a instância do Tomcat.

Quando a JVM é suspensa no ZipExceptionponto de interrupção, você deve acessar JarFile.getManifestFromReference()o rastreio da pilha e verificar o atributo namepara ver o nome do arquivo.

Depois disso, você deve excluir o arquivo do sistema de arquivos e clicar com o botão direito do mouse em seu projeto, selecionar Maven, Atualizar projeto, verificar Forçar atualização de snapshots / liberações.

Matias Sebastiao
fonte
11
Eu acredito que essa deve ser a resposta aceita. Simplesmente remover centenas de arquivos jar e baixá-los novamente não é uma solução eficiente.
Mohsen
11
rm -rf .m2 = eficaz
Jeryl Cozinhe
2
Técnica de depuração incrível lá. Me salvou de desperdiçar largura de banda para baixar todas as dependências ou artefatos. Obrigado.
Thariq Nugrohotomo
3
Ótima técnica! Não foi possível encontrar o quadro JarFile, mas aqui encontrei-o como a expressão ZipFile.this.name no quadro ZipFile $ ZipFileInputStream.read.
Rlpatrao
2
Um exemplo simples desses jarros corrompidos: stackoverflow.com/a/46623719/3128926 Demorou 2 horas para entender qual é o problema. Aliás, remover apenas os arquivos jar relacionados é suficiente em vez de limpar todo o cache local do maven.
Levent Divilioglu
41

No gsitgithub / find-currupt-jars.txt , o comando a seguir lista todos os arquivos jar corrompidos no repositório:

find  /home/me/.m2/repository/ -name "*jar" | xargs -L 1 zip -T | grep error | grep invalid

Você pode excluir os arquivos jar corrompidos e recompilar o projeto.

Exemplo de saída:

warning [/cygdrive/J/repo/net/java/dev/jna/jna/4.1.0/jna-4.1.0.jar]:  98304 extra bytes at beginning or within zipfile
  (attempting to process anyway)
file #1:  bad zipfile offset (local header sig):  98304
  (attempting to re-compensate)
zip error: Zip file invalid, could not spawn unzip, or wrong unzip (original files unmodified)
Javier
fonte
1
sudo find ./repository/ -name "*jar" | sudo xargs -L 1 zip -T | grep error | grep invalid me dá xargs: zip: No such file or directory. isso está usando o bash no ubuntu no windows, fyi
liltitus27 /
1
@ liltitus27 Esta linha de comando executa zip -T(teste) em cada jar abaixo e repository, em seguida, filtra quais jars são arquivos compactados inválidos. Você tem zipcomando disponível?
Javier
parece que no bash, eu não tenho o zip instalado. No entanto, achei que o comando exato que você postou funciona lindamente no cygwin. e também, ele trabalhou em encontrar jarros ruins, obrigado!
liltitus27
2
Você é o melhor, HOMEM!
Igor Masternoy
A idéia é executar zip -Tem cada jar armazenado em .m2/repository. No Windows, você pode executá-lo no Cygwin ( /cygdrive/C/Users/torno/.m2/repository) como eu fiz e acho que você também pode executá-lo com o Bash no Windows 10 ( /mnt/c/Users/torno/.m2/repository). Não investiguei como escrever um script equivalente no PowerShell e acho que não deve ser possível com um prompt de cmd.
21418 Javier
11

Eu gostaria de dar minha prática.

Use seu IDE preferido, use o eclipse por exemplo aqui:

  1. Encontre um local apropriado na pilha de exceções
  2. Definir ponto de interrupção condicional
  3. Depurar
  4. Ele imprimirá o jar corrompido antes da exceção

insira a descrição da imagem aqui

samm
fonte
1
Esta é uma solução muito melhor que limpar todo o repositório m2, que no meu caso levaria séculos para ser baixado novamente.
Martin Cassidy
5

A solução para mim foi executar mvncom -X:

$ mvn package -X

Em seguida, olhe para trás na saída até ver a falha e continue até ver o último arquivo jar que o mvn tentou processar:

...
... <<output ommitted>>
...
[DEBUG] Processing JAR /Users/snowch/.m2/repository/org/eclipse/jetty/jetty-server/9.2.15.v20160210/jetty-server-9.2.15.v20160210.jar
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 3.607 s
[INFO] Finished at: 2017-10-04T14:30:13+01:00
[INFO] Final Memory: 23M/370M
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-shade-plugin:3.1.0:shade (default) on project kafka-connect-on-cloud-foundry: Error creating shaded jar: invalid LOC header (bad signature) -> [Help 1]
org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute goal org.apache.maven.plugins:maven-shade-plugin:3.1.0:shade (default) on project kafka-connect-on-cloud-foundry: Error creating shaded jar: invalid LOC header (bad signature)

Veja o último jar antes que ele falhe e remova-o do repositório local, ou seja,

$ rm -rf /Users/snowch/.m2/repository/org/eclipse/jetty/jetty-server/9.2.15.v20160210/
Chris Snow
fonte
2

Parece um problema de configuração para o compilador maven em seu arquivo pom. A origem e o destino java da versão padrão é 1.5, mesmo o JDK usado possui uma versão superior.

Para corrigir, adicione a seção de configuração do plug-in do compilador maven com versão java superior, exemplo:

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-compiler-plugin</artifactId>
  <version>3.6.1</version>
  <configuration>
    <source>1.6</source>
    <target>1.6</target>
  </configuration>
</plugin>

Para mais informações, verifique estes links:

compilador maven

relatório de erro

harvyS
fonte
1

Esta resposta não é para os funcionários do DevOps / administrador do sistema, mas para aqueles que usam o IDE como eclipse e enfrentam invalid LOC header (bad signature)problemas.

Você pode forçar a atualização das dependências do maven, da seguinte maneira:

insira a descrição da imagem aqui

insira a descrição da imagem aqui

Vishrant
fonte
1

Aqui está um pequeno detector escrito em Java, basta copiar e executar :)

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;
import java.util.jar.JarFile;
import java.util.stream.Collectors;

public class JarValidator {

    public static void main(String[] args) throws IOException {
        Path repositoryPath = Paths.get("C:\\Users\\goxr3plus\\.m2");

        // Check if the main Repository Exists
        if (Files.exists(repositoryPath)) {

            // Create a class instance
            JarValidator jv = new JarValidator();

            List<String> jarReport = new ArrayList<>();
            jarReport.add("Repository to process: " + repositoryPath.toString());

            // Get all the directory files
            List<Path> jarFiles = jv.getFiles(repositoryPath, ".jar");
            jarReport.add("Number of jars to process: " + jarFiles.size());
            jarReport.addAll(jv.openJars(jarFiles, true));

            // Print the report
            jarReport.stream().forEach(System.out::println);

        } else {
            System.out.println("Repository path " + repositoryPath + " does not exist.");
        }
    }

    /**
     * Get all the files from the given directory matching the specified extension
     * 
     * @param filePath      Absolute File Path
     * @param fileExtension File extension
     * @return A list of all the files contained in the directory
     * @throws IOException
     */
    private List<Path> getFiles(Path filePath, String fileExtension) throws IOException {
        return Files.walk(filePath).filter(p -> p.toString().endsWith(fileExtension)).collect(Collectors.toList());
    }

    /**
     * Try to open all the jar files
     * 
     * @param jarFiles
     * @return A List of Messages for Corrupted Jars
     */
    private List<String> openJars(List<Path> jarFiles, boolean showOkayJars) {
        int[] badJars = { 0 };
        List<String> messages = new ArrayList<>();

        // For Each Jar
        jarFiles.forEach(path -> {

            try (JarFile file = new JarFile(path.toFile())) {
                if (showOkayJars)
                    messages.add("OK : " + path.toString());
            } catch (IOException ex) {
                messages.add(path.toAbsolutePath() + " threw exception: " + ex.toString());
                badJars[0]++;
            }
        });

        messages.add("Total bad jars = " + badJars[0]);
        return messages;
    }

}

Resultado

Repository to process: C:\Users\goxr3plus\.m2
Number of jars to process: 4920
C:\Users\goxr3plus\.m2\repository\bouncycastle\isoparser-1.1.18.jar threw exception: java.util.zip.ZipException: zip END header not found
Total bad jars = 1
BUILD SUCCESSFUL (total time: 2 seconds)
GOXR3PLUS
fonte
1

Podemos forçar a validação da soma de verificação no maven com pelo menos duas opções:

1.Adicionando --strict-checksumsao nosso comando maven.

2.Adicionando a seguinte configuração ao nosso arquivo de configurações do maven:

<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0
                          https://maven.apache.org/xsd/settings-1.0.0.xsd">
    <!--...-->
    <profiles>
        <profile>
            <!--...-->
            <repositories>
                <repository>
                    <id>codehausSnapshots</id>
                    <name>Codehaus Snapshots</name>
                    <releases>
                        <enabled>false</enabled>
                        <updatePolicy>always</updatePolicy>
                        <checksumPolicy>fail</checksumPolicy>
                    </releases>
                    <snapshots>
                        <enabled>true</enabled>
                        <updatePolicy>never</updatePolicy>
                        <checksumPolicy>fail</checksumPolicy>
                    </snapshots>
                    <url>
                        <!--...-->
                    </url>
                </repository>
            </repositories>
            <pluginRepositories>
                <!--...-->
            </pluginRepositories>
            <!--...-->
        </profile>
    </profiles>
    <!--...-->
</settings>

Mais detalhes neste post: https://dzone.com/articles/maven-artifact-checksums-what

SHoko
fonte
0

Além de remover .m2 / repository, remova o aplicativo do servidor, execute o servidor (sem aplicativos), pare-o e adicione o aplicativo novamente. Agora é suposto funcionar. Por alguma razão, apenas limpar as pastas do servidor da interface não tem o mesmo efeito.

Alex
fonte
0

Eu estava enfrentando esse problema ao implantar meu ouvido na minha instância do weblogic local. Limpar o repositório local e criar o ouvido novamente resolveu o problema para mim.

SMT_Dev
fonte