当前位置: 首页 > 面试题库 >

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

郜振国
2023-03-14
问题内容

我的webapp允许用户上传jar文件。但是,将jar文件上传后,它已损坏。我已经通过比较md5校验和(winmd5free)对此进行了验证。

上传的jar文件看起来“正常”和“正确”

  • 与原始文件相比,文件大小看起来不错(在KB级别)
  • 我可以使用7z打开上载的jar文件并查看其内容(资源和类文件),并且与原始文件相比,一切都相同

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

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

此外,当我双击罐子(Windows)时,出现以下消息。

错误:jar文件无效或损坏

我的问题是

  • 有没有办法以编程方式检查jar文件是否有效?我本来希望JarInputStream能够立即检测到此问题,但它根本没有显示任何问题
  • 当我在Windows中双击jar文件时,是否是java.exe给了我无效或损坏的jarfile消息?
  • 当无效的jar文件作为类路径的一部分传入时,为什么没有错误/异常抛出,为什么呢?例如 java -cp upload.jar; libs * com.some.class.Test 吗?

请注意,这与罐子签名和/或检查罐子的签名无关。它只是检查一个文件(是否已上传)是否是有效的jar文件(不一定是jar的类文件是否有效,因为已经有关于此问题的另一篇文章)。

运行结果

jar -tvf upload.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)

问题答案:

以编程方式检测无效的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文件无效,则在实例化ZipFile时将引发ZipException。



 类似资料:
  • 问题内容: 我正在使用Java 7 IO的新功能,实际上我试图接收文件夹的所有xml文件。但这在文件夹不存在时引发异常,如何检查新IO是否存在该文件夹? 问题答案: 使用: 您可以选择传递此方法的值: 还有一种方法:

  • 问题内容: 我试图找到一种聪明的方法来找出传递给sed的文件是否已成功更改。 基本上,我想知道文件是否已更改,而不必查看文件修改日期。 我之所以需要这样做,是因为如果sed成功替换了模式,我需要做一些额外的事情。 我目前有: 上面的代码有点贵,我希望能够在这里使用一些技巧。 问题答案: 您可以改用: ” 我忽略了该功能:您可以根据需要使用Shell做重定向。 叹。下面有许多评论要求提供有关shel

  • 问题内容: Go的标准库没有专门用于检查文件是否存在的函数(如Python的)。什么是 惯用的 方式做到这一点? 问题答案: 要检查文件是否不存在,等同于Python的文件: 要检查文件是否存在,等效于Python的文件: 编辑:根据最近的评论

  • 问题内容: 在打开文件以Java读取之前,如何检查文件是否存在?(相当于Perl的)。 关于SO的唯一类似问题涉及写入文件,因此使用回答了该问题,这显然不适用于此处。 如果可能的话,我宁愿使用真正的API调用返回,而不是使用“调用API来打开文件并在引发异常时捕获并在文本中检查’无文件’的情况下捕获”,但是我可以接受后者。 问题答案: 使用:

  • 问题内容: 我需要检查远程服务器上是否存在特定文件。使用和不起作用。有什么想法如何快速轻松地做到这一点? 问题答案: 您必须使用CURL

  • Go的标准库没有专门用于检查文件是否存在的功能(如Python的)。