关于stackoverflow的问题很多,但是解决方法是继续使用.m2
Maven文件夹并删除jar文件。这不是一个很好的解决方案:有时有10个损坏的jar,我需要手动搜索一个。在春季,该项目有65个依赖项,这是一场噩梦。
Reading ZIP file gives an 'invalid LOC header' Exception
Invalid LOC header(bad signature)
我主要是Eclipse用户,但实际上使用了所有主要的IDE(Intellij和Netbeans)。我们到了2019年,没有插件或工具可以检测到这种损坏的罐子并用新的罐子替换吗?
在Eclipse中,您可以尝试强制Maven重新下载依赖项,但不能替换损坏的jar。
这是一个非常严重的问题,因为我偶尔会丢失30分钟来修复损坏的罐子。
如果可以的话,请给我建议某种解决方案。
答案 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)