Розгортання проекту Maven кидає java.util.zip.ZipException: недійсний заголовок LOC (неправильна підпис)


164

Я отримую нижче виключення, коли я запускаю свою mvn install. Я навіть видалив локальне сховище і знову побіг, отримуючи той самий виняток.

[ПОМИЛКА] Не вдалося виконати ціль org.apache.maven.plugins: maven-shadow-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 Не існує дійсно коду в цьому репо (за винятком класу README), ще менше, ніж у плагіні Maven. Я думаю, що плагін Maven був би найкращим рішенням, фактично - або просто розширенням одного з існуючих плагінів, що дозволило зробити щось на кшталт того mvn dependencies validateчи іншого ...
Marco13

Код для сховища Марко - той у класі lol :)
GOXR3PLUS

Відповіді:


79

Вам потрібно перевірити, яка баночка викликає проблеми. Він повинен бути зіпсований. Видаліть цю банку та запустіть mvn spring-boot:runкоманду ще раз. Можливо, більше, ніж одна jar пошкоджена, тому кожен раз, коли вам потрібно виконати цю команду, щоб видалити її. У моєму випадку mysql, jackson, аспектні банки були пошкоджені mvn spring-boot:runкомандою 3 рази, і я з'ясував це та видалив банки з .m2папки. Зараз питання вирішено.


218

Файл jar може бути пошкодженим. Спробуйте видалити вміст наступної папки:

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

Потім клацніть правою кнопкою миші проект, виберіть Maven, Update Project, перевірте на Force Update Snapshots / Releases.


4
Це слід позначити як рішення. Я вважаю, що це також рішення ряду інших пов'язаних питань, на які немає відповідей. Дякую Сіва!
Hack-R

1
дуже приємно .. витративши 7 годин, я знайшов рішення ... KUDOS для тебе чоловік ....
Sufiyan Ansari

4
Це працює, але видалення всього локального сховища Maven - не найкращий варіант. Просто видаліть відповідні файли jar і цього достатньо.
Левент Дівіліоглу

2
Не потрібно видаляти всі залежності, у верхній частині ви можете знайти, у яких залежностей є поганий заголовок LOC.
umar faraz

2
Зазначимо лише очевидне: Коли хтось стикається invalid LOC headerу побудові Gradle, ви просто видаляєте ~/.gradle/cachesпапку (Linux).
Martin Martin Vseticka

110

Основна проблема - це зіпсовані банки.

Щоб знайти пошкоджену, вам потрібно додати точку розриву винятку Java у пункті Переключення точок Eclipse або вибраний IDE, вибрати java.util.zip.ZipExceptionклас та перезапустити екземпляр Tomcat.

Коли JVM призупиняється на точці ZipExceptionрозриву, вам потрібно перейти до JarFile.getManifestFromReference()сліду стека та перевірити атрибут, nameщоб побачити ім'я файлу.

Після цього слід видалити файл з файлової системи, а потім клацнути правою кнопкою миші ваш проект, виберіть Maven, Update Project, перевірте пункт Force Update of Snapshots / Releases.


11
Я вважаю, що це має бути прийнятою відповіддю. Просто видалення сотень файлів jar та повторна завантаження їх не є ефективним рішенням.
Мохсен

11
rm -rf .m2 = дієвий
Джеріл Кук

2
Дивовижна техніка налагодження там. Врятувало мене від втрати пропускної здатності, щоб завантажити цілі залежності або артефакти. Дякую.
Thariq Nugrohotomo

3
Чудова техніка !. Я не зміг знайти кадр JarFile, але тут він знайшов його як вираз ZipFile.this.name на кадрі ZipFile $ ZipFileInputStream.read.
rlpatrao

2
Простий приклад цієї зіпсованої банки: stackoverflow.com/a/46623719/3128926 Знадобилося 2 години, щоб зрозуміти, у чому проблема. Btw, видалення лише пов'язаних файлів jar достатньо, а не очищення всього локального кешу Maven.
Левент Дівіліоглу

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 invalid дає мені xargs: zip: No such file or directory. це використання bash на ubuntu на windows, fyi
liltitus27

1
@ liltitus27 Цей командний рядок виконує zip -T(тестує) кожну банку під repository, а потім фільтрує, які банки є недійсними стислими файлами. Чи є у вас zipдоступні команди?
Хав'єр

здається, що в баші у мене не встановлений zip. Однак я виявив, що точна команда, яку ви написали, прекрасно працює в Cygwin. а також, це працювало в пошуку поганих банок, дякую!
liltitus27

2
Ти найкращий, МАН!
Ігор Мастерний

Ідея полягає у запуску zip -Tна кожну банку, що зберігається .m2/repository. У Windows ви можете запустити його на Cygwin ( /cygdrive/C/Users/torno/.m2/repository), як я це зробив, і я думаю, ви також можете запустити його з Bash на Windows 10 ( /mnt/c/Users/torno/.m2/repository). Я не досліджував, як написати еквівалентний скрипт з PowerShell, і я думаю, що це не повинно бути можливим із запитом cmd.
Хав'єр

11

Я хотів би дати свою практику.

Використовуйте перевагу IDE, наприклад, затемніть:

  1. Знайдіть відповідне місце в стеку винятків
  2. Встановити умовну точку розриву
  3. Налагодити це
  4. Він надрукує зіпсовану банку перед винятком

введіть тут опис зображення


1
Це набагато краще рішення, що очищення всього сховища м2, яке в моєму випадку займе століття для завантаження знову.
Мартін Кассіді

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 у вашому пом-файлі. Версія та ціль 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, як затемнення та обличчя invalid LOC header (bad signature) проблемою.

Ви можете змусити оновити основні залежності таким чином:

введіть тут опис зображення

введіть тут опис зображення


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

Я зіткнувся з цією проблемою під час розгортання вуха в моєму місцевому екземплярі weblogic. Очищення локального сховища та створення вуха знову вирішили проблему для мене.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.