Menyebarkan proyek Maven melempar java.util.zip.ZipException: header LOC tidak valid (tanda tangan buruk)

164

Saya mendapatkan pengecualian di bawah ini ketika saya menjalankan mvn install. Saya bahkan telah menghapus repositori lokal dan berlari lagi mendapatkan pengecualian yang sama.

[GALAT] Gagal menjalankan sasaran org.apache.maven.plugins: maven-shade-plugin: 2.1: naungan (default) pada inti-kumpulan proyek: Kesalahan saat membuat tabung berarsir: header LOC yang tidak valid (tanda tangan buruk) -> [Bantuan 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>

Kesalahan:

[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
sumber
1
Membuat plugin untuk masalah ini -> github.com/goxr3plus/CorruptedJarsDetector
GOXR3PLUS
1
@ GOXR3PLUS Sebenarnya tidak ada kode dalam repo itu (kecuali untuk kelas di README), bahkan lebih sedikit dari plugin Maven. Saya pikir plugin maven akan menjadi solusi terbaik, sebenarnya - atau hanya perpanjangan dari salah satu plugin yang ada yang memungkinkan untuk melakukan sesuatu seperti kira-kira mvn dependencies validate...
Marco13
Marco kode untuk repositori adalah yang ada di kelas lol :)
GOXR3PLUS

Jawaban:

79

Anda perlu memeriksa stoples mana yang memberi masalah. Itu harus rusak. Hapus stoples itu dan jalankan mvn spring-boot:runperintah lagi. Mungkin lebih dari satu jar rusak sehingga setiap kali Anda perlu menjalankan perintah itu untuk menghapus jar itu. Dalam kasus saya mysql, jackson, guci aspek rusak mvn spring-boot:runperintah 3 kali dan saya mencari tahu ini dan menghapus guci dari .m2folder. Sekarang masalah telah teratasi.

alok
sumber
218

File jar mungkin rusak. Coba hapus konten folder berikut:

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

Kemudian klik kanan proyek Anda, pilih Maven, Perbarui Proyek, periksa Force Update of Snapshots / Rilis.

Siva Anand
sumber
4
Ini harus ditandai sebagai solusinya. Saya percaya ini juga solusi untuk beberapa pertanyaan terkait lainnya yang tidak memiliki jawaban. Siva terima kasih!
Hack-R
1
sangat baik .. setelah menghabiskan 7 jam saya menemukan solusinya ... KUDOS untuk Anda ...
Sufiyan Ansari
4
Ini berfungsi tetapi menghapus seluruh repositori lokal pakar bukan pilihan terbaik. Hapus saja file jar terkait dan itu sudah cukup.
Levent Divilioglu
2
Tidak harus menghapus semua dependensi, di atas Anda dapat menemukan dependensi mana yang memiliki Header LOC buruk.
umar faraz
2
Hanya untuk mencatat yang sudah jelas: Ketika seseorang bertemu invalid LOC headerdi Gradle build, Anda cukup menghapus ~/.gradle/cachesfolder (Linux).
Martin Vseticka
110

Masalah utamanya adalah toples yang rusak.

Untuk menemukan yang rusak, Anda perlu menambahkan Java Exception Breakpoint di Breakpoints View of Eclipse, atau IDE pilihan Anda, pilih java.util.zip.ZipExceptionkelasnya, dan mulai kembali instance Tomcat.

Ketika JVM ditangguhkan di ZipExceptionbreakpoint Anda harus pergi ke JarFile.getManifestFromReference()dalam jejak tumpukan, dan periksa atribut nameuntuk melihat nama file.

Setelah itu, Anda harus menghapus file dari sistem file dan kemudian klik kanan proyek Anda, pilih Maven, Perbarui Proyek, periksa Force Update dari Snapshots / Rilis.

Matias Sebastiao
sumber
11
Saya percaya ini harus menjadi jawaban yang diterima. Cukup menghapus ratusan file jar dan mengunduhnya kembali bukanlah solusi yang efisien.
Mohsen
11
rm -rf .m2 = efektif
Jeryl Cook
2
Teknik debugging yang luar biasa di sana. Menyelamatkan saya dari membuang-buang bandwidth untuk mengunduh seluruh dependensi atau artefak. Terima kasih.
Thariq Nugrohotomo
3
Teknik hebat! Saya tidak dapat menemukan bingkai JarFile, tetapi di sini menemukannya sebagai ekspresi ZipFile.this.name di bingkai ZipFile $ ZipFileInputStream.read.
rlpatrao
2
Contoh sederhana dari toples yang rusak ini: stackoverflow.com/a/46623719/3128926 Butuh waktu 2 jam untuk memahami apa masalahnya. Btw, menghapus hanya file jar terkait sudah cukup alih-alih membersihkan seluruh cache lokal maven.
Levent Divilioglu
41

Dari gsitgithub / find-currupt-jars.txt , perintah berikut mencantumkan semua file jar yang rusak di repositori:

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

Anda dapat menghapus file jar yang rusak, dan mengkompilasi ulang proyek.

Contoh output:

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
sumber
1
sudo find ./repository/ -name "*jar" | sudo xargs -L 1 zip -T | grep error | grep invalid memberi saya xargs: zip: No such file or directory. ini menggunakan bash di ubuntu di windows, fyi
liltitus27
1
@ liltitus27 Baris perintah ini mengeksekusi zip -T(menguji) pada setiap toples di bawah repository, lalu menyaring guci mana yang merupakan file terkompresi yang tidak valid. Apakah Anda memiliki zipperintah?
Javier
tampaknya dalam bash, saya tidak menginstal zip. Saya memang menemukan bahwa perintah persis yang Anda posting berfungsi dengan baik di cygwin. dan juga, itu berhasil menemukan toples yang buruk, terima kasih!
liltitus27
2
Kamu yang terbaik, MAN!
Igor Masternoy
Idenya adalah untuk menjalankan zip -Tsetiap stoples yang disimpan di bawah .m2/repository. Di Windows, Anda dapat menjalankannya di Cygwin ( /cygdrive/C/Users/torno/.m2/repository) seperti yang saya lakukan, dan saya pikir Anda juga dapat menjalankannya dengan Bash di Windows 10 ( /mnt/c/Users/torno/.m2/repository). Saya tidak menyelidiki bagaimana menulis skrip yang setara dengan PowerShell, dan saya pikir itu tidak mungkin dengan prompt cmd.
Javier
11

Saya ingin memberikan latihan saya.

Gunakan IDE pilihan Anda, ambil gerhana misalnya di sini:

  1. Temukan lokasi yang sesuai dalam tumpukan pengecualian
  2. Setel breakpoint bersyarat
  3. Debug itu
  4. Ini akan mencetak toples yang rusak sebelum pengecualian

masukkan deskripsi gambar di sini

samm
sumber
1
Ini adalah solusi yang jauh lebih baik yang membersihkan seluruh repositori m2, yang dalam kasus saya perlu waktu lama untuk diunduh lagi.
Martin Cassidy
5

Solusi bagi saya adalah menjalankannya mvndengan -X:

$ mvn package -X

Kemudian lihat ke belakang melalui output sampai Anda melihat kegagalan dan kemudian terus sampai Anda melihat file jar terakhir yang mencoba diproses oleh mvn:

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

Lihatlah toples terakhir sebelum gagal dan lepaskan itu dari repositori lokal, mis

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

Sepertinya masalah konfigurasi untuk maven compiler di file pom Anda. Sumber dan target java versi default adalah 1.5, bahkan JDK yang digunakan memiliki versi lebih tinggi.

Untuk memperbaikinya, tambahkan bagian konfigurasi plugin compiler maven dengan versi java yang lebih tinggi, contoh:

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

Untuk info lebih lanjut, periksa tautan ini:

kompiler pakar

laporan bug

harvyS
sumber
1

Jawaban ini bukan untuk DevOps / admin sistem, tetapi bagi mereka yang menggunakan IDE seperti gerhana dan invalid LOC header (bad signature)masalah yang dihadapi .

Anda dapat memaksa memperbarui dependensi pakar, sebagai berikut:

masukkan deskripsi gambar di sini

masukkan deskripsi gambar di sini

Vishrant
sumber
1

Berikut ini adalah detektor kecil yang ditulis dalam Java, cukup salin dan jalankan :)

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

}

Keluaran

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

Kami dapat memaksa validasi checksum dalam maven dengan setidaknya dua opsi:

1. Menambahkan --strict-checksums perintah maven kami.

2. Menambahkan konfigurasi berikut ke file pengaturan pakar kami:

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

Lebih detail dalam posting ini: https://dzone.com/articles/maven-artifact-checksums-what

SHoko
sumber
0

Selain menghapus .m2 / repositori, hapus aplikasi dari server, jalankan server (tanpa aplikasi), hentikan dan tambahkan aplikasi lagi. Sekarang seharusnya berfungsi. Untuk beberapa alasan hanya membersihkan folder server dari antarmuka tidak memiliki efek yang sama.

Alex
sumber
0

Saya menghadapi masalah ini ketika menggunakan telinga saya untuk contoh weblogic lokal saya. Membersihkan repositori lokal dan membuat telinga kembali menyelesaikan masalah untuk saya.

SMT_Dev
sumber