使用Maven时避免损坏的Jars(无效的LOC标头)

时间:2018-10-10 13:36:50

标签: java eclipse maven intellij-idea netbeans

关于stackoverflow的问题很多,但是解决方法是继续使用.m2 Maven文件夹并删除jar文件。这不是一个很好的解决方案:有时有10个损坏的jar,我需要手动搜索一个。在春季,该项目有65个依赖项,这是一场噩梦。

Reading ZIP file gives an 'invalid LOC header' Exception

Invalid LOC header(bad signature)

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

我主要是Eclipse用户,但实际上使用了所有主要的IDE(Intellij和Netbeans)。我们到了2019年,没有插件或工具可以检测到这种损坏的罐子并用新的罐子替换吗?

在Eclipse中,您可以尝试强制Maven重新下载依赖项,但不能替换损坏的jar。

这是一个非常严重的问题,因为我偶尔会丢失30分钟来修复损坏的罐子。

如果可以的话,请给我建议某种解决方案。

1 个答案:

答案 0 :(得分:1)

我怀疑我的方法可能不是您想要的,但是创建一个尝试为Maven存储库中的每个 *。jar 文件实例化java.util.jar.JarFile()的应用程序是微不足道的。

如果该实例存在问题,只需捕获jar文件的名称和异常并将其记录下来。显然,您应该不会有任何异常,因此,为了进行测试,我在一个实际的Jar文件中进行了二进制编辑,以测试代码。

此代码是为Windows编写的。由于它访问文件系统,因此可能需要对其他平台进行调整,但是除此之外,您只需要修改在main()中指定Maven Repository名称的字符串即可:

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)