Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用Maven时避免损坏的JAR(无效的LOC头)_Java_Eclipse_Maven_Intellij Idea_Netbeans - Fatal编程技术网

Java 使用Maven时避免损坏的JAR(无效的LOC头)

Java 使用Maven时避免损坏的JAR(无效的LOC头),java,eclipse,maven,intellij-idea,netbeans,Java,Eclipse,Maven,Intellij Idea,Netbeans,关于stackoverflow有很多问题,但是解决方案是执行.m2Maven文件夹并删除jar文件。这不是一个很好的解决方案:有时有10个损坏的罐子,我需要手动逐个搜索它们。在春天,这个项目有65个依赖项,这真是一场噩梦 我主要是一个Eclipse用户,但实际上使用了所有主要的IDE(Intellij和Netbeans)。我们在2019年,没有插件或工具可以检测到这种损坏的jar并用新的jar替换它们 在Eclipse中,您可以尝试强制Maven重新下载依赖项,但不能替换损坏的JAR 这是

关于stackoverflow有很多问题,但是解决方案是执行
.m2
Maven文件夹并删除jar文件。这不是一个很好的解决方案:有时有10个损坏的罐子,我需要手动逐个搜索它们。在春天,这个项目有65个依赖项,这真是一场噩梦

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

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

这是一个非常严重的问题,因为每隔一段时间,我就要花30分钟修理损坏的罐子


如果有的话,请给我一些解决方案。

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

如果实例化有问题,只需捕获jar文件的名称和异常并记录它。显然,您不应该得到任何异常,所以为了测试,我对一个真实的Jar文件进行了二进制编辑,只是为了测试代码

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


对我来说,你的帖子不仅仅是一个问题,而是一种咆哮。你能修改它来发布一个可以回答的具体问题吗?根据我的日历,我们仍然在2018年;也许如果你等一年,问题就会解决。但开玩笑的是,我想我只遇到过一次这样的问题。如果您经常收到此消息,您可能希望检查internet连接的质量或硬盘是否存在坏扇区。@GOXR3PLUS在看到您的问题后,我开始使用一个工具(带有GUI和pom拖放等功能)。。。这真的只是拖延,我真的应该工作。但是你看到了吗?对于这样一个超越了标准工具箱所能完成的一些事情的工具,没有太多的事情要做…好吧,我可能已经在这里设置了不同的优先级。。。结果是在。它解析一个POM文件的特定依赖项,并在UI中显示它们的状态,允许删除无效JAR并从Maven Central刷新它们。我只是在几个小时内把它砍掉了,所以它可能有bug或缺陷,或者根本不适合你,但也许有人会觉得它有用。对我来说,这是一个研究编程Maven依赖解析和其他东西的机会……该工具“重构”/“扩展”的第一步是更清晰地分离模型和视图,以便更容易在其上插入JavaFXUI。(现在应该不是很难,但我正在使用我自己的一些Swing库,其功能在JavaFX中可能不可用)。当然,下一步是提供只扫描整个本地
m2
文件夹的选项。我基本上已经准备/考虑过了,但还没有实现它。好吧,你现在就开始了,我将使它成为一个真正的应用程序,带有JavaFX的UI。谢谢你,先生,甚至是一个Eclipse插件。。。以前从未写过。。。虽然:)即使充其量也不是真正的解决方案。想必您真的希望在创建坏JAR时收到警报,而这种方法不能做到这一点。但它很简单,而且很有效。@GOXR3PLUS使用Java的WatchService API可能是一条出路。当JAR添加到存储库中的文件夹时,您可能会收到通知,并几乎实时地处理这些通知:)
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)