Избегайте поврежденных банок (неверный заголовок LOC) при использовании Maven - PullRequest
0 голосов
/ 10 октября 2018

Есть много вопросов по stackoverflow по этому поводу, но решение идет на .m2 Папка Maven и удаление файлов JAR.Это не лучшее решение: иногда есть 10 поврежденных банок, и мне нужно вручную искать их по одной.В Spring с 65 зависимостями от проекта это кошмар.

Чтение ZIP-файла дает «недопустимый заголовок LOC» Исключение

Недопустимый заголовок LOC (неверная подпись))

https://kingring.wordpress.com/2014/01/27/solve-maven-compile-error-invalid-loc-header-bad-signature/

Я в основном пользователь Eclipse, но на самом деле использую все основные IDE (Intellij и Netbeans).Мы находимся в 2019 году, и не существует плагина или инструмента, который бы обнаруживал подобные поврежденные банки и заменял их новыми свежими?

В Eclipse вы можете попытаться заставить Maven перезагружать зависимости, но не заменять поврежденные банки..

Это очень серьезная проблема, потому что время от времени я теряю 30 минут, чтобы починить поврежденные банки.

Пожалуйста, предложите мне какое-нибудь решение, если оно есть.

1 Ответ

0 голосов
/ 11 октября 2018

Я подозреваю, что мой подход может быть не тем, что вам нужно, но довольно просто создать приложение, которое пытается создать экземпляр java.util.jar.JarFile() для каждого файла *. Jar в репозитории Maven.

Если есть проблема с этим экземпляром, просто запишите имя файла jar и исключение и зарегистрируйте его.Очевидно, вы не должны получать никаких исключений, поэтому для тестирования я выполнил двоичное редактирование реального файла Jar просто для проверки кода.

Этот код был написан для Windows.Так как он обращается к файловой системе, он может нуждаться в настройке для других платформ, но кроме этого вам нужно только изменить строку, указав имя репозитория Maven в main():

package jarvalidator;

import java.io.*;
import java.nio.file.*;
import java.util.*;
import java.util.jar.*;
import java.util.stream.*;

public class JarValidator {

    public static void main(String[] args) throws IOException {
        Path repositoryPath = Path.of("C:\\Users\\johndoe\\.m2");

        if (Files.exists(repositoryPath)) {
            JarValidator jv = new JarValidator();
            List<String> jarReport = new ArrayList<>();
            jarReport.add("Repository to process: " + repositoryPath.toString());
            List<Path> jarFiles = jv.getFiles(repositoryPath, ".jar");
            jarReport.add("Number of jars to process: " + jarFiles.size());
            jarReport.addAll(jv.openJars(jarFiles));
            jarReport.stream().forEach(System.out::println);
        } else {
            System.out.println("Repository path " + repositoryPath + " does not exist.");
        }
    }

    private List<Path> getFiles(Path filePath, String fileExtension) throws IOException {
        return Files.walk(filePath)
                .filter(p -> p.toString().endsWith(fileExtension))
                .collect(Collectors.toList());
    }

    private List<String> openJars(List<Path> jarFiles) {
        int badJars = 0;
        List<String> messages = new ArrayList<>();

        for (Path path : jarFiles) {
            try {
                new JarFile(path.toFile()); // Just dheck for an exception on instantiation.
            } catch (IOException ex) {
                messages.add(path.toAbsolutePath() + " threw exception: " + ex.toString());
                badJars++;
            }
        }
        messages.add("Total bad jars = " + badJars);
        return messages;
    }
}

Это выводот запуска кода:

run:
Repository to process: C:\Users\johndoe\.m2
Number of jars to process: 4920
C:\Users\johndoe\.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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...