การปรับใช้โครงการ Maven พ่น java.util.zip.ZipException: ส่วนหัว LOC ไม่ถูกต้อง (ลายเซ็นไม่ถูกต้อง)


164

mvn installฉันได้รับข้อยกเว้นนี้เมื่อฉันทำงานของฉัน ฉันได้ลบที่เก็บในเครื่องแล้วและยังได้รับข้อยกเว้นเดียวกันอีกครั้ง

[ข้อผิดพลาด] ล้มเหลวในการดำเนินการเป้าหมาย org.apache.maven.plugins: maven-shade-plugin: 2.1: แรเงา (ค่าเริ่มต้น) บนโปรเจ็กต์ชุดแบทช์: ข้อผิดพลาดในการสร้าง jar สีเทา: ส่วนหัว LOC ไม่ถูกต้อง (ลายเซ็นไม่ดี) -> [ช่วยเหลือ 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>

ข้อผิดพลาด:

[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
สร้างปลั๊กอินสำหรับปัญหานี้ -> github.com/goxr3plus/CorruptedJarsDetector
GOXR3PLUS

1
@ GOXR3PLUS ไม่มีรหัสจริงๆใน repo นั้น (ยกเว้นคลาสใน README) แม้แต่น้อยกว่าของ Maven plugin ฉันคิดว่าปลั๊กอิน maven จะเป็นทางออกที่ดีที่สุดจริง ๆ - หรือเป็นเพียงส่วนเสริมของหนึ่งในปลั๊กอินที่มีอยู่ที่อนุญาตให้ทำอะไรบางอย่างเช่นmvn dependencies validate...
Marco13

Marco รหัสสำหรับพื้นที่เก็บข้อมูลเป็นหนึ่งในระดับฮ่า ๆ :)
GOXR3PLUS

คำตอบ:


79

คุณต้องตรวจสอบว่าโถตัวใดมีปัญหา มันจะต้องเสียหาย ลบ jar นั้นแล้วรันmvn spring-boot:runคำสั่งอีกครั้ง อาจมีมากกว่านั้นหนึ่งขวดที่เสียหายดังนั้นทุกครั้งที่คุณจำเป็นต้องเรียกใช้คำสั่งนั้นเพื่อลบ jar นั้น ในกรณีของฉัน mysql, jackson, jars กว้างยาวเสียหายmvn spring-boot:run3 ครั้งและฉันเข้าใจและลบ jars ออกจาก.m2โฟลเดอร์ ขณะนี้ปัญหาได้รับการแก้ไขแล้ว


218

ไฟล์ jar อาจเสียหาย ลองลบเนื้อหาของโฟลเดอร์ต่อไปนี้:

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

จากนั้นคลิกขวาที่โครงการของคุณเลือก Maven, Update Project, ตรวจสอบ Force Update ของ Snapshots / Release


4
ควรทำเครื่องหมายเป็นโซลูชัน ฉันเชื่อว่ามันเป็นคำตอบสำหรับคำถามที่เกี่ยวข้องอื่น ๆ ซึ่งไม่มีคำตอบ ขอบคุณพระอิศวร!
Hack-R

1
ดีมาก .. หลังจากใช้เวลา 7 ชั่วโมงฉันพบวิธีแก้ปัญหา ... KUDOS สำหรับคุณผู้ชาย ....
Sufiyan Ansari

4
วิธีนี้ใช้งานได้ แต่การลบที่เก็บโลคัล maven ทั้งหมดไม่ใช่ตัวเลือกที่ดีที่สุด เพียงแค่ลบไฟล์ jar ที่เกี่ยวข้องและนั่นก็เพียงพอแล้ว
Levent Divilioglu

2
ไม่จำเป็นต้องลบการอ้างอิงทั้งหมดด้านบนคุณจะพบว่าการพึ่งพาใดที่มีส่วนหัว LOC ที่ไม่ดี
umar faraz

2
สิ่งที่ควรสังเกต: เมื่อใครบางคนพบinvalid LOC headerในการสร้าง Gradle คุณเพียงแค่ลบ~/.gradle/cachesโฟลเดอร์ (Linux)
Martin Vseticka

110

ปัญหาหลักคือขวดที่เสียหาย

ในการค้นหาสิ่งที่เสียหายคุณต้องเพิ่มJava Exception เบรกพอยต์ในมุมมองเบรกพอยต์ของ Eclipse หรือ IDE ที่คุณต้องการเลือก java.util.zip.ZipExceptionคลาสและเริ่มอินสแตนซ์ Tomcat ใหม่

เมื่อ JVM หยุดพักที่ZipExceptionเบรกพอยต์คุณต้องไปที่ JarFile.getManifestFromReference()การติดตามสแต็กและตรวจสอบคุณสมบัติnameเพื่อดูชื่อไฟล์

หลังจากนั้นคุณควรลบไฟล์ออกจากระบบไฟล์จากนั้นคลิกขวาที่โครงการของคุณเลือก Maven, Update Project, ตรวจสอบ Force Update ของ Snapshots / Release


11
ฉันเชื่อว่านี่ควรเป็นคำตอบที่ยอมรับได้ การลบไฟล์ jar หลายร้อยไฟล์และการดาวน์โหลดซ้ำไม่ใช่โซลูชันที่มีประสิทธิภาพ
Mohsen

11
rm -rf .m2 = ประสิทธิผล
Jeryl Cook

2
เทคนิคการดีบักที่ยอดเยี่ยมที่นั่น บันทึกฉันจากการสิ้นเปลืองแบนด์วิดท์เพื่อดาวน์โหลดการอ้างอิงหรือสิ่งประดิษฐ์ทั้งหมด ขอบคุณ.
Thariq Nugrohotomo

3
เทคนิคที่ยอดเยี่ยม! ฉันไม่พบเฟรม JarFile แต่ที่นี่พบว่าเป็นนิพจน์ ZipFile.this.name บนกรอบ ZipFile $ ZipFileInputStream.read
rlpatrao

2
ตัวอย่างง่ายๆของไหที่เสียหายนี้: stackoverflow.com/a/46623719/3128926 ใช้เวลา 2 ชั่วโมงเพื่อทำความเข้าใจปัญหาที่เกิดขึ้น Btw การลบเฉพาะไฟล์ jar ที่เกี่ยวข้องก็เพียงพอแล้วแทนที่จะล้างแคชโลคัล maven ทั้งหมด
Levent Divilioglu

41

จากgsitgithub / find-currupt-jars.txtคำสั่งต่อไปนี้จะแสดงรายการไฟล์ jar ที่เสียหายทั้งหมดในที่เก็บ:

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

คุณสามารถลบไฟล์ jar ที่เสียหายและคอมไพล์โครงการใหม่

ตัวอย่างผลลัพธ์:

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 invalidxargs: zip: No such file or directoryให้ฉัน นี่ใช้ bash บน Ubuntu บน windows, fyi
liltitus27

1
@ liltitus27 บรรทัดคำสั่งนี้ดำเนินการzip -T(ทดสอบ) บนแต่ละ jar ภายใต้repositoryจากนั้นกรองขวดที่เป็นไฟล์บีบอัดที่ไม่ถูกต้อง คุณมีzipคำสั่งหรือไม่
Javier

ดูเหมือนว่าในทุบตีฉันไม่ได้ติดตั้ง zip ฉันพบว่าคำสั่งที่แน่นอนที่คุณโพสต์นั้นทำงานได้อย่างสวยงามใน cygwin และมันก็ทำงานในการหาขวดที่ไม่ดีขอบคุณ!
liltitus27

2
คุณคือสุดยอดมนุษย์!
Igor Masternoy

ความคิดคือการทำงานในแต่ละขวดที่เก็บไว้ภายใต้zip -T .m2/repositoryใน Windows คุณสามารถเรียกใช้บน Cygwin ( /cygdrive/C/Users/torno/.m2/repository) ตามที่ฉันทำและฉันคิดว่าคุณสามารถใช้งานได้ด้วย Bash บน Windows 10 ( /mnt/c/Users/torno/.m2/repository) ฉันไม่ได้ตรวจสอบวิธีการเขียนสคริปต์ที่เทียบเท่ากับ PowerShell และฉันคิดว่าไม่น่าจะเป็นไปได้ด้วยพรอมต์คำสั่ง
Javier

11

ฉันต้องการให้การฝึกฝน

ใช้ IDE ที่คุณต้องการใช้ eclipse ยกตัวอย่างเช่นที่นี่:

  1. ค้นหาตำแหน่งที่เหมาะสมภายในสแตกข้อยกเว้น
  2. ตั้งจุดพักตามเงื่อนไข
  3. แก้ไขข้อบกพร่อง
  4. มันจะพิมพ์ขวดที่เสียหายก่อนข้อยกเว้น

ป้อนคำอธิบายรูปภาพที่นี่


1
นี่เป็นทางออกที่ดีกว่าการล้างพื้นที่เก็บข้อมูล m2 ทั้งหมดซึ่งในกรณีของฉันอาจใช้เวลานานในการดาวน์โหลดอีกครั้ง
Martin Cassidy

5

ทางออกสำหรับฉันคือการทำงานmvnด้วย-X:

$ mvn package -X

จากนั้นมองย้อนกลับผ่านเอาต์พุตจนกว่าคุณจะเห็นความล้มเหลวจากนั้นทำต่อไปจนกว่าคุณจะเห็นไฟล์ jar ล่าสุดที่ 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)

ดูขวดสุดท้ายก่อนที่มันจะล้มเหลวและลบมันออกจากที่เก็บภายในเครื่องเช่น

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

2

ดูเหมือนว่าปัญหาการกำหนดค่าสำหรับ maven คอมไพเลอร์ในไฟล์ pom ของคุณ ซอร์สต้นทางและปลายทางเวอร์ชัน java เริ่มต้นคือ 1.5 แม้กระทั่งใช้ JDK มีเวอร์ชันที่สูงกว่า

ในการแก้ไขให้เพิ่มส่วนการกำหนดค่าปลั๊กอินคอมไพเลอร์ maven ด้วยเวอร์ชัน java ที่สูงขึ้นเช่น:

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

สำหรับข้อมูลเพิ่มเติมตรวจสอบลิงค์เหล่านี้:

คอมไพเลอร์ Maven

รายงานข้อผิดพลาด


1

คำตอบนี้ไม่ได้สำหรับพวกผู้ดูแลระบบ DevOps / ระบบ แต่สำหรับพวกเขาที่ใช้ IDE เช่น eclipse และหันหน้าไปทางinvalid LOC header (bad signature)ปัญหา

คุณสามารถบังคับให้อัพเดตการพึ่งพา maven ดังต่อไปนี้:

ป้อนคำอธิบายรูปภาพที่นี่

ป้อนคำอธิบายรูปภาพที่นี่


1

นี่คือตัวตรวจจับขนาดเล็กที่เขียนใน Java เพียงคัดลอกและเรียกใช้ :)

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

}

เอาท์พุต

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

เราสามารถบังคับให้การตรวจสอบการตรวจสอบใน Maven มีอย่างน้อยสองตัวเลือก:

1. การเพิ่ม--strict-checksumsคำสั่ง maven ของเรา

2. เพิ่มการกำหนดค่าต่อไปนี้ไปยังไฟล์การตั้งค่า 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>

รายละเอียดเพิ่มเติมในโพสต์นี้: https://dzone.com/articles/maven-artifact-checksums-what


0

นอกเหนือจากการลบ. m2 / พื้นที่เก็บข้อมูลให้ลบแอปพลิเคชันจากเซิร์ฟเวอร์เรียกใช้เซิร์ฟเวอร์ (ไม่มีแอปพลิเคชัน) หยุดมันและเพิ่มแอปพลิเคชันอีกครั้ง ตอนนี้มันควรจะทำงาน ด้วยเหตุผลบางอย่างเพียงล้างโฟลเดอร์เซิร์ฟเวอร์จากส่วนต่อประสานไม่มีผลเหมือนกัน


0

ฉันกำลังประสบปัญหานี้ในขณะที่ปรับใช้หูของฉันกับอินสแตนซ์บล็อกเกอร์ท้องถิ่นของฉัน การล้างที่เก็บในเครื่องและสร้างหูอีกครั้งช่วยแก้ปัญหาให้ฉันได้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.