Triển khai dự án Maven ném java.util.zip.ZipException: tiêu đề LỘC không hợp lệ (chữ ký xấu)


164

Tôi nhận được ngoại lệ dưới đây khi tôi chạy mvn install. Tôi thậm chí đã xóa kho lưu trữ cục bộ và chạy lại nhận được ngoại lệ tương tự.

[ERROR] Không thể thực hiện mục tiêu org.apache.maven.plugins: maven-bóng-plugin: 2.1: bóng râm (mặc định) trên lõi dự án: Lỗi tạo jar bóng mờ: tiêu đề LỘC không hợp lệ (chữ ký xấu) -> [Trợ giúp 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>

Lỗi:

[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
Tạo một plugin cho vấn đề này -> github.com/goxr3plus/CorruptedJarsDetector
GOXR3PLUS

1
@ GOXR3PLUS Không thực sự có mã trong repo đó (ngoại trừ lớp trong README), thậm chí ít hơn so với plugin Maven. Tôi nghĩ rằng một plugin maven sẽ là giải pháp tốt nhất, thực sự - hoặc chỉ là một phần mở rộng của một trong những plugin hiện có cho phép làm một cái gì đó tương tự mvn dependencies validate...
Marco13

Mã Marco cho kho lưu trữ là mã trong lớp lol :)
GOXR3PLUS

Câu trả lời:


79

Bạn cần kiểm tra xem cái bình nào đang đưa ra vấn đề. Nó phải bị hỏng. Xóa bình đó và chạy mvn spring-boot:runlại lệnh. Có thể nhiều hơn một jar đã bị hỏng vì vậy mỗi khi bạn cần chạy lệnh đó để xóa jar đó. Trong trường hợp của tôi mysql, jackson, jars khía cạnh đã bị hỏng mvn spring-boot:runlệnh 3 lần và tôi tìm ra điều này và xóa các lọ khỏi .m2thư mục. Bây giờ vấn đề đã được giải quyết.


218

Các tập tin jar có thể bị hỏng. Hãy thử xóa nội dung của thư mục sau:

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

Sau đó nhấp chuột phải vào dự án của bạn, chọn Maven, Cập nhật dự án, kiểm tra Cập nhật bắt buộc của Snapshots / Phát hành.


4
Điều này nên được đánh dấu là giải pháp. Tôi tin rằng nó cũng là giải pháp cho một số câu hỏi liên quan khác không có câu trả lời. Cảm ơn Siva!
Hack-R

1
rất tốt .. sau khi dành 7 giờ tôi đã tìm ra giải pháp ... KUDOS cho bạn người đàn ông ....
Sufiyan Ansari

4
Điều này hoạt động nhưng xóa toàn bộ kho lưu trữ cục bộ maven không phải là lựa chọn tốt nhất. Chỉ cần xóa các tập tin jar liên quan và thế là đủ.
Levent Divilioglu

2
Không phải xóa tất cả các phụ thuộc, trên đầu bạn có thể tìm thấy các phụ thuộc nào có Tiêu đề LỘC xấu.
umar faraz

2
Chỉ cần lưu ý rõ ràng: Khi ai đó gặp phải invalid LOC headertrong bản dựng Gradle, bạn chỉ cần xóa ~/.gradle/cachesthư mục (Linux).
Martin Vseticka

110

Vấn đề chủ yếu là bình bị hỏng.

Để tìm cái bị hỏng, bạn cần thêm Điểm dừng ngoại lệ Java trong Khung nhìn Breakpoint của Eclipse hoặc IDE ưa thích của bạn, chọn java.util.zip.ZipException lớp và khởi động lại cá thể Tomcat.

Khi JVM tạm dừng tại ZipExceptionđiểm dừng, bạn phải truy cập JarFile.getManifestFromReference()vào theo dõi ngăn xếp và kiểm tra thuộc tính nameđể xem tên tệp.

Sau đó, bạn nên xóa tệp khỏi hệ thống tệp và sau đó nhấp chuột phải vào dự án của bạn, chọn Maven, Cập nhật dự án, kiểm tra Cập nhật bắt buộc của Snapshots / Phát hành.


11
Tôi tin rằng đây nên là câu trả lời được chấp nhận. Chỉ cần xóa hàng trăm tệp jar và tải xuống lại chúng không phải là một giải pháp hiệu quả.
Mohsen

11
rm -rf .m2 = hiệu quả
Jeryl Cook

2
Kỹ thuật sửa lỗi tuyệt vời đó. Cứu tôi khỏi lãng phí băng thông để tải xuống toàn bộ phụ thuộc hoặc tạo tác. Cảm ơn bạn.
Thariq Nugrohotomo

3
Kỹ thuật tuyệt vời! Tôi không thể tìm thấy khung JarFile, nhưng ở đây tìm thấy nó dưới dạng biểu thức ZipFile.this.name trên khung ZipFile $ ZipFileInputStream.read.
rlpatrao

2
Một ví dụ đơn giản về các lọ bị hỏng này: stackoverflow.com/a/46623719/3128926 Mất 2 giờ để hiểu vấn đề là gì. Btw, chỉ xóa các tệp jar liên quan là đủ thay vì xóa toàn bộ bộ đệm cục bộ maven.
Levent Divilioglu

41

Từ gsitgithub / find-currentupt-jars.txt , lệnh sau liệt kê tất cả các tệp jar bị hỏng trong kho lưu trữ:

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

Bạn có thể xóa các tệp jar bị hỏng và biên dịch lại dự án.

Ví dụ đầu ra:

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 mang lại cho tôi xargs: zip: No such file or directory. đây là sử dụng bash trên
ubfox

1
@ liltitus27 Dòng lệnh này thực thi zip -T(kiểm tra) trên mỗi jar bên dưới repository, sau đó lọc các tệp nào là tệp nén không hợp lệ. Bạn có zipsẵn lệnh không?
Javier

Dường như trong bash, tôi không cài đặt zip. Tuy nhiên, tôi thấy rằng lệnh chính xác mà bạn đã đăng hoạt động rất tốt trong cygwin, tuy nhiên. và cũng, nó đã làm việc trong việc tìm kiếm lọ xấu, cảm ơn!
liltitus27

2
Bạn là người đàn ông tốt nhất!
Igor Masternoy

Ý tưởng là để chạy zip -Ttrên mỗi bình được lưu trữ dưới .m2/repository. Trong Windows, bạn có thể chạy nó trên Cygwin ( /cygdrive/C/Users/torno/.m2/repository) như tôi đã làm và tôi nghĩ bạn cũng có thể chạy nó với Bash trên Windows 10 ( /mnt/c/Users/torno/.m2/repository). Tôi đã không điều tra cách viết một tập lệnh tương đương với PowerShell và tôi nghĩ rằng nó không thể thực hiện được với dấu nhắc cmd.
Javier

11

Tôi muốn cho tôi thực hành của tôi.

Sử dụng IDE ưa thích của bạn, lấy nhật thực chẳng hạn ở đây:

  1. Tìm một vị trí thích hợp trong ngăn xếp ngoại lệ
  2. Đặt điểm dừng có điều kiện
  3. Gỡ lỗi nó
  4. Nó sẽ in bình bị hỏng trước ngoại lệ

nhập mô tả hình ảnh ở đây


1
Đây là một giải pháp tốt hơn nhiều để xóa toàn bộ kho lưu trữ m2, trong trường hợp của tôi sẽ mất nhiều thời gian để tải xuống lại.
Martin Cassidy

5

Giải pháp cho tôi là chạy mvnvới -X:

$ mvn package -X

Sau đó nhìn ngược lại thông qua đầu ra cho đến khi bạn thấy lỗi và sau đó tiếp tục cho đến khi bạn thấy tệp jar cuối cùng mà mvn đã cố xử lý:

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

Nhìn vào bình cuối cùng trước khi nó thất bại và xóa nó khỏi kho lưu trữ cục bộ, tức là

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

2

Có vẻ như vấn đề cấu hình cho trình biên dịch maven trong tệp pom của bạn. Phiên bản và nguồn java mặc định là 1,5, thậm chí JDK đã sử dụng có phiên bản cao hơn.

Để khắc phục, hãy thêm phần cấu hình plugin trình biên dịch maven với phiên bản java cao hơn, ví dụ:

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

Để biết thêm thông tin kiểm tra các liên kết sau:

trình biên dịch maven

báo cáo lỗi


1

Câu trả lời này không dành cho những người quản trị hệ thống / DevOps, mà dành cho những người đang sử dụng IDE như nhật thực và đối mặt invalid LOC header (bad signature) vấn đề.

Bạn có thể buộc cập nhật các phụ thuộc maven, như sau:

nhập mô tả hình ảnh ở đây

nhập mô tả hình ảnh ở đây


1

Đây là một máy dò nhỏ được viết bằng Java, chỉ cần sao chép và chạy :)

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

}

Đầu ra

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

Chúng tôi có thể buộc xác thực tổng kiểm tra trong maven với ít nhất hai tùy chọn:

1.Adding --strict-checksums lệnh maven của chúng tôi.

2.Adding cấu hình sau vào tệp cài đặt maven của chúng tôi:

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

Thêm chi tiết trong bài đăng này: https://dzone.com/articles/maven-artifact-checksums-what


0

Ngoài việc xóa .m2 / kho lưu trữ, hãy xóa ứng dụng khỏi máy chủ, chạy máy chủ (không có ứng dụng), dừng ứng dụng đó và thêm lại ứng dụng. Bây giờ nó được cho là để làm việc. Vì một số lý do, việc dọn dẹp các thư mục máy chủ khỏi giao diện không có tác dụng tương tự.


0

Tôi đã phải đối mặt với vấn đề này trong khi triển khai tai của tôi đến ví dụ weblogic địa phương của tôi. Xóa kho lưu trữ cục bộ và xây dựng tai một lần nữa giải quyết vấn đề cho tôi.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.