如何检查 JAR 文件是否有效?

2022-09-03 07:42:12

我的 webapp 允许用户上传 JAR 文件。但是,在上传 jar 文件后,该文件已损坏。我已经通过比较上传文件之前和之后的MD5校验和(winmd5free)来验证这一点。

上传的 jar 文件与原始文件几乎完全相同:

  • 与原始文件相比,文件大小相似(在KB级别)
  • 我可以使用解压缩程序打开上传的jar文件并查看其内容(资源和类文件),与原始文件相比,一切都是相同的

当我打开上传的jar文件(使用Notepad ++)时,我确实注意到二进制内容与原始内容不同。另外,当我过去阅读JAR条目时,没有条目。JarInputStream

JarInputStream is = new JarInputStream(new FileInputStream(new File("uploaded.jar")));
JarEntry entry = null;
while(null != (entry = is.getNextJarEntry())) {
    System.out.println(entry.getName());
}

此外,当我双击jar(Windows)时,我会收到以下消息。

错误:无效或损坏的 jar 文件

我的问题是:

  • 有没有办法以编程方式检查jar文件是否有效?我本来希望立即检测到这一点,但它根本没有显示任何问题JarInputStream
  • 当我在窗口中双击jar文件时,java.exe是否给了我“无效或损坏的JAR文件”消息?
  • 为什么当一个无效的jar文件作为类路径的一部分传入时,不会引发错误/异常?例如,通过运行命令?java -cp uploaded.jar;libs\* com.some.class.Test

这个问题与 jar 签名和/或检查 JAR 文件的签名无关。它只是检查一个文件(上传或未上传)是否是有效的JAR文件(不一定是jar的类文件是否有效,因为已经有另一个关于这个问题的SO帖子)。

我的跑步结果 :jar -tvf uploaded.jar

java.util.zip.ZipException: error in opening zip file
        at java.util.zip.ZipFile.open(Native Method)
        at java.util.zip.ZipFile.<init>(ZipFile.java:127)
        at java.util.zip.ZipFile.<init>(ZipFile.java:88)
        at sun.tools.jar.Main.list(Main.java:977)
        at sun.tools.jar.Main.run(Main.java:222)
        at sun.tools.jar.Main.main(Main.java:1147)

答案 1

以编程方式检测无效 jar 文件的一种方法是使用 。java.util.ZipFile

public static void main(String[] args) {
    if(args.length < 1) {
        System.err.println("need jar file");
        return;
    }
    
    String pathname = args[0];
    try {
        ZipFile file = new ZipFile(new File(pathname));
        Enumeration<? extends ZipEntry> e = file.entries();
        while(e.hasMoreElements()) {
            ZipEntry entry = e.nextElement();
            System.out.println(entry.getName());
        }
    } catch(Exception ex) {
        ex.printStackTrace();
    }
}

如果 jar 文件无效,则在实例化对象时将引发 a。ZipExceptionZipFile


答案 2

推荐