Maven 프로젝트를 배포하면 java.util.zip.ZipException이 발생합니다. 잘못된 LOC 헤더 (잘못된 서명)


164

내을 실행할 때 아래 예외가 발생합니다 mvn install. 로컬 저장소를 삭제하고 동일한 예외가 다시 발생했습니다.

[오류] 프로젝트 코어에서 org.apache.maven.plugins : maven-shade-plugin : 2.1 : shade (기본값) 목표를 실행하지 못했습니다. ]

<?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 해당 리포지토리에는 실제로 코드가 없지만 (README의 클래스 제외) Maven 플러그인의 코드는 훨씬 적습니다. 필자는 maven 플러그인이 가장 좋은 해결책이라고 생각합니다. 또는 기존 플러그인 중 하나를 확장 한 것입니다 mvn dependencies validate.
Marco13

마르코는 저장소의 코드 : 클래스 롤의 하나입니다
GOXR3PLUS

답변:


79

어떤 항아리에 문제가 있는지 확인해야합니다. 손상되어 있어야합니다. 해당 jar을 삭제하고 mvn spring-boot:run명령을 다시 실행 하십시오. 하나의 jar이 손상되었을 수 있으므로 해당 jar을 삭제하기 위해 해당 명령을 실행해야 할 때마다. 필자의 경우 mysql, jackson, aspect jars mvn spring-boot:run명령이 3 번 손상 되었으며이를 알아 내고 .m2폴더 에서 jar을 삭제했습니다 . 이제 문제가 해결되었습니다.


218

jar 파일이 손상되었을 수 있습니다. 다음 폴더의 내용을 제거하십시오.

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

그런 다음 프로젝트를 마우스 오른쪽 버튼으로 클릭하고 Maven, 프로젝트 업데이트를 선택하고 스냅 샷 / 릴리스 강제 업데이트를 확인하십시오.


4
솔루션으로 표시해야합니다. 나는 그것이 대답이없는 다른 여러 관련 질문에 대한 해결책이라고 생각합니다. 고마워 시바!
Hack-R

1
아주 좋은 ... 나는 당신이 사람을위한 솔루션 ... KUDOS .... 발견 7시간을 보낸 이후
Sufiyan 안사리를

4
이것은 작동하지만 전체 maven 로컬 저장소를 삭제하는 것이 가장 좋은 방법은 아닙니다. 관련 jar 파일을 삭제하면 충분합니다.
Levent Divilioglu

2
모든 종속성을 삭제할 필요는 없습니다. 맨 위에서 LOC 헤더가 잘못된 종속성을 찾을 수 있습니다.
umar faraz

2
명백한 점을 명심하십시오 : invalid LOC headerGradle 빌드에서 누군가가 발생하면 ~/.gradle/caches폴더 (Linux) 만 삭제하십시오 .
Martin Vseticka

110

주로 문제는 손상된 항아리입니다.

손상된 항목을 찾으려면 Eclipse의 중단 점보기 또는 선호하는 IDE에서 Java 예외 중단 점 을 추가 하고 java.util.zip.ZipException클래스를 선택한 후 Tomcat 인스턴스를 다시 시작해야합니다.

JVM이 중단 ZipException점 에서 일시 중단되면 JarFile.getManifestFromReference()스택 추적으로 이동하여 속성 name을 확인하여 파일 이름을 확인해야합니다 .

그런 다음 파일 시스템에서 파일을 삭제 한 다음 프로젝트를 마우스 오른쪽 단추로 클릭하고 Maven, 프로젝트 업데이트를 선택하고 스냅 샷 / 릴리스 강제 업데이트를 확인하십시오.


11
나는 이것이 받아 들여야 할 답변이라고 생각합니다. 단순히 수백 개의 jar 파일을 제거하고 다시 다운로드하는 것은 효율적인 솔루션이 아닙니다.
Mohsen

11
rm -rf .m2 = 유효
Jeryl Cook

2
멋진 디버깅 기술이 있습니다. 전체 종속성 또는 아티팩트를 다운로드하기 위해 대역폭을 낭비하지 않아도됩니다. 감사합니다.
Thariq Nugrohotomo

3
훌륭한 기술!. JarFile 프레임을 찾을 수 없지만 여기에서 ZipFile $ ZipFileInputStream.read 프레임에서 ZipFile.this.name 표현식으로 발견되었습니다.
rlpatrao

2
이 손상된 항아리의 간단한 예 : stackoverflow.com/a/46623719/3128926 문제가 무엇인지 이해하기 위해 2 시간이 걸렸습니다. Btw, 전체 메이븐 로컬 캐시를 지우는 대신 관련 jar 파일 만 제거하면 충분합니다.
Levent Divilioglu

41

에서 gsitgithub / 찾아-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 invalid 나에게 준다 xargs: zip: No such file or directory. 이것은 윈도우에서 우분투에서 bash를 사용하고 있습니다.
liltitus27

1
@ liltitus27이 명령 행은의 zip -T각 jar에서 실행 (테스트) repository한 다음 어떤 jar가 유효하지 않은 압축 파일인지 필터링합니다. 당신이 있습니까 zip사용할 수있는 명령을?
Javier

bash에는 zip이 설치되어 있지 않은 것 같습니다. 그러나 게시 한 정확한 명령은 cygwin에서 아름답게 작동한다는 것을 알았습니다. 또한 나쁜 항아리를 찾는 데 도움이되었습니다. 감사합니다!
liltitus27

2
당신은 최고예요!
Igor Masternoy

아이디어는에 zip -T저장된 각 jar 에서 실행하는 것입니다 .m2/repository. Windows에서는 /cygdrive/C/Users/torno/.m2/repository내가했던 것처럼 Cygwin ( )에서 실행할 수 있으며 Windows 10 ( /mnt/c/Users/torno/.m2/repository)의 Bash에서도 실행할 수 있다고 생각합니다 . PowerShell을 사용하여 동등한 스크립트를 작성하는 방법을 조사하지 않았으며 cmd 프롬프트에서는 사용할 수 없어야한다고 생각합니다.
Javier

11

제 연습을하고 싶습니다.

선호하는 IDE를 사용하고 예를 들어 다음과 같이 일식을 취하십시오.

  1. 예외 스택 내에서 적절한 위치를 찾으십시오.
  2. 조건부 중단 점 설정
  3. 그것을 디버그
  4. 예외 전에 손상된 항아리를 인쇄합니다.

여기에 이미지 설명을 입력하십시오


1
이것은 전체 m2 저장소를 지우는 훨씬 나은 솔루션입니다. 필자의 경우 다시 다운로드하는 데 오랜 시간이 걸립니다.
마틴 캐시디

5

나를위한 해결책은 다음 mvn-X같습니다.

$ mvn package -X

그런 다음 실패가 나타날 때까지 출력을 거꾸로 본 다음 mvn이 처리하려고 시도한 마지막 jar 파일이 나타날 때까지 계속 진행하십시오.

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

pom 파일의 maven 컴파일러 구성 문제처럼 보입니다. 기본 버전 Java 소스 및 대상은 1.5이며 사용되는 JDK도 더 높은 버전입니다.

수정하려면 더 높은 Java 버전으로 maven 컴파일러 플러그인 구성 섹션을 추가하십시오 (예 :

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

자세한 정보는 다음 링크를 확인하십시오.

메이븐 컴파일러

버그 리포트


1

이 답변은 DevOps / 시스템 관리자가 아니라 일식 및 직면과 같은 IDE를 사용하는 사람들을위한 것입니다. 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 / repository를 제거하는 것 외에도 서버에서 응용 프로그램을 제거하고 (응용 프로그램없이) 서버를 실행 한 후 중지하고 다시 추가하십시오. 이제 작동합니다. 어떤 이유로 인터페이스에서 서버 폴더를 정리해도 동일한 효과가 없습니다.


0

귀를 로컬 weblogic 인스턴스에 배포하는 동안이 문제에 직면했습니다. 로컬 저장소를 지우고 귀를 다시 구축하면 문제가 해결되었습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.