Maven projesini dağıtmak java.util.zip.ZipException durumunu atar: geçersiz LOC başlığı (hatalı imza)


164

Ben çalıştırdığımda aşağıdaki istisnayı alıyorum mvn install. Hatta yerel depoyu sildim ve yine aynı istisnayı alıyorum.

[ERROR] org.apache.maven.plugins hedefi yürütülemedi: maven-shade-plugin: 2.1: proje çekirdek kümesinde gölge (varsayılan): Gölgeli kavanoz oluşturma hatası: geçersiz LOC başlığı (hatalı imza) -> [Yardım 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>

Hata:

[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

1
Bu sorun için bir eklenti yaptım -> github.com/goxr3plus/CorruptedJarsDetector
GOXR3PLUS

1
@ GOXR3PLUS Bu repoda gerçekten bir kod yok (README'deki sınıf hariç), bir Maven eklentisinden bile daha az. Bir maven eklentisinin en iyi çözüm olacağını düşünüyorum - ya da böyle bir şey yapmaya izin veren mevcut eklentilerden birinin bir uzantısı mvn dependencies validate...
Marco13 13:18

Marco depo için kod lol sınıfındaki bir :)
GOXR3PLUS

Yanıtlar:


79

Hangi kavanozun sorun çıkardığını kontrol etmeniz gerekir. Bozuk olmalı. Bu kavanozu silin ve mvn spring-boot:runkomutu tekrar çalıştırın . Bir kavanozun bozuk olduğundan daha fazla olabilir, bu yüzden o kavanozu silmek için bu komutu her çalıştırmanız gerekir. Benim durumumda mysql, jackson, en boy kavanoz mvn spring-boot:runkomutu 3 kez bozuldu ve bunu anladım ve kavanozları .m2klasörden sildim . Şimdi sorun çözüldü.


218

Jar dosyası bozuk olabilir. Aşağıdaki klasörün içeriğini kaldırmayı deneyin:

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

Ardından, projenizi sağ tıklayın, Maven, Projeyi Güncelle'yi seçin, Anlık Görüntülerin / Sürümlerin Güncellemesini Zorla'yı işaretleyin.


4
Bu çözüm olarak işaretlenmelidir. Aynı zamanda cevabı olmayan diğer ilgili soruların da çözümü olduğuna inanıyorum. Teşekkürler Siva!
Hack-R

1
çok güzel .. 7 saat geçirdikten sonra çözümü buldum ... KUDOS senin için adamım ....
Sufiyan Ansari

4
Bu işe yarar ancak tüm yerel depoyu silmek en iyi seçenek değildir. İlgili jar dosyalarını silmeniz yeterlidir.
Levent Divilioğlu

2
Tüm bağımlılıkları silmek zorunda değilsiniz, üstte hangi bağımlılıkların kötü LOC Başlığı olduğunu bulabilirsiniz.
umar faraz

2
Açık invalid LOC headerolanı not etmek için: Birisi Gradle derlemesinde karşılaştığında , ~/.gradle/cachesklasörü (Linux) silmeniz yeterlidir .
Martin Vseticka

110

Esas sorun bozuk kavanozlardır.

Bozuk olanı bulmak için Eclipse'nin Kesme Noktaları Görünümü'ne veya tercih ettiğiniz IDE'ye bir Java Exception Breakpoint eklemeniz , java.util.zip.ZipExceptionsınıfı seçmeniz ve Tomcat örneğini yeniden başlatmanız gerekir.

JVM ZipExceptionkesme noktasında askıya alındığında, JarFile.getManifestFromReference()yığın izlemesine gitmeli nameve dosya adını görmek için özniteliği kontrol etmelisiniz .

Bundan sonra, dosyayı dosya sisteminden silmeli ve ardından projenize sağ tıklamalı, Maven, Projeyi Güncelle, Anlık Görüntülerin / Sürümlerin Güncellemesini Zorla'yı işaretlemelisiniz.


11
Bunun kabul edilen cevap olması gerektiğine inanıyorum. Sadece yüzlerce jar dosyasını kaldırmak ve yeniden indirmek etkili bir çözüm değildir.
Mohsen

11
rm -rf .m2 = etkili
Jeryl Cook

2
Orada harika hata ayıklama tekniği. Tüm bağımlılıkları veya eserleri indirmek için beni bant genişliğini boşa harcamaktan kurtardı. Teşekkür ederim.
Thariq Nugrohotomo

3
Harika bir teknik! JarFile çerçeve bulunamadı, ancak burada ZipFile $ ZipFileInputStream.read çerçevesinde ifade ZipFile.this.name bulundu.
rlpatrao

2
Bu bozuk kavanozlara basit bir örnek: stackoverflow.com/a/46623719/3128926 Sorunun ne olduğunu anlamak için 2 saat sürdü. Btw, tüm yerel önbelleği temizlemek yerine yalnızca ilgili jar dosyalarını kaldırmak yeterlidir.
Levent Divilioğlu

41

Gönderen gsitgithub / bulmak-Currupt-jars.txt , aşağıdaki komutu listelerinde depoda bozuk kavanoz dosyaları:

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

Bozuk jar dosyalarını silebilir ve projeyi yeniden derleyebilirsiniz.

Örnek çıktı:

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)

1
sudo find ./repository/ -name "*jar" | sudo xargs -L 1 zip -T | grep error | grep invalid verir xargs: zip: No such file or directory. Bu windows,
fyi

1
@ liltitus27 Bu komut satırı , zip -Taltındaki her kavanozda (test) yürütür repository, ardından hangi kavanozların geçersiz sıkıştırılmış dosyalar olduğunu filtreler. Eğer var mı zipmevcut komutunu?
Javier

bash, ben zip yüklü yok gibi görünüyor. Gönderdiğiniz tam komutun cygwin'de güzel çalıştığını buldum. ve ayrıca, kötü kavanozlar bulmak için çalıştı, teşekkürler!
liltitus27

2
Sen en iyisisin MAN!
Igor Masternoy

Fikir, zip -Taltında depolanan her kavanoz üzerinde çalıştırmaktır .m2/repository. Windows'da, Cygwin ( /cygdrive/C/Users/torno/.m2/repository) üzerinde yaptığım gibi çalıştırabilirsiniz ve bence Windows 10'da Bash ile de çalıştırabilirsiniz ( /mnt/c/Users/torno/.m2/repository). PowerShell ile eşdeğer bir komut dosyası nasıl yazılacağını araştırmadım ve bir cmd istemi ile bunun mümkün olmaması gerektiğini düşünüyorum.
Javier

11

Uygulamamı vermek istiyorum.

Tercih ettiğiniz IDE'yi kullanın, örneğin burada tutulmayı alın:

  1. İstisna yığınında uygun bir yer bulun
  2. Koşullu kesme noktası belirle
  3. Hata ayıkla
  4. İstisnadan önce bozuk kavanozu basacaktır

resim açıklamasını buraya girin


1
Bu, m2 havuzunun tamamını temizleyen, benim durumumda tekrar indirmenin uzun zaman alacağı çok daha iyi bir çözüm.
Martin Cassidy

5

Benim için çözüm çalıştırmayı oldu mvnile -X:

$ mvn package -X

Ardından, hatayı görene kadar çıktıya geriye doğru bakın ve mvn'nin işlemeye çalıştığı son jar dosyasını görene kadar devam edin:

...
... <<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)

Başarısızlıktan önceki son kavanoza bakın ve bunu yerel depodan kaldırın, yani

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

2

Pom dosyanızdaki maven derleyicisi için yapılandırma sorunu gibi görünüyor. Varsayılan sürüm java kaynağı ve hedef 1.5, hatta kullanılan JDK daha yüksek bir sürüme sahiptir.

Düzeltmek için, daha yüksek java sürümüne sahip maven derleyici eklentisi yapılandırma bölümünü ekleyin, örnek:

<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>

Daha fazla bilgi için şu bağlantıları kontrol edin:

maven derleyici

hata raporu


1

Bu cevap DevOps / sistem yöneticisi çocuklar için değil, IDE'yi tutulma ve karşılaşma invalid LOC header (bad signature)sorunu gibi kullanan kişiler içindir .

Aşağıdaki gibi maven bağımlılıklarını güncellemeye zorlayabilirsiniz:

resim açıklamasını buraya girin

resim açıklamasını buraya girin


1

İşte Java ile yazılmış küçük bir dedektör, sadece kopyala ve çalıştır :)

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;
    }

}

Çıktı

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)

1

En azından iki seçenekle mavende sağlama toplamı doğrulamasını zorlayabiliriz:

1. ekleme --strict-checksums .

2.Maven ayarları dosyasına aşağıdaki yapılandırmayı ekleyerek:

<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>

Bu yayında daha fazla ayrıntı: https://dzone.com/articles/maven-artifact-checksums-what


0

.M2 / havuzu kaldırmanın ötesinde, uygulamayı sunucudan kaldırın, sunucuyu çalıştırın (uygulama olmadan), durdurun ve uygulamayı tekrar ekleyin. Şimdi çalışması gerekiyor. Bazı nedenlerden dolayı, sadece sunucu klasörlerini arayüzden temizlemek aynı etkiye sahip değildir.


0

Kulağımı yerel weblogic örneğime yerleştirirken bu sorunla karşı karşıyaydım. Yerel depoyu temizlemek ve kulağı inşa etmek sorunu benim için tekrar çözdü.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.