【问题标题】:How can I check if a JAR file is valid?如何检查 JAR 文件是否有效?
【发布时间】:2013-12-07 18:23:22
【问题描述】:

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

上传的jar文件和原来的几乎一模一样:

  • 与原始文件相比,文件大小相似(在 KB 级别)
  • 我可以使用解压程序打开上传的 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());
}

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

错误:jarfile 无效或损坏

我的问题是:

  • 有没有办法以编程方式检查 jar 文件是否有效?我原以为 JarInputStream 会立即检测到这一点,但它根本没有问题
  • 当我在 Windows 中双击 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)

【问题讨论】:

  • 在命令行上,像这样运行 jar 命令:jar -tvf &lt;jarname&gt;。 't' 表示“测试”,'v' 我相信表示“详细”,而“f”表示“文件”。您还可以在任何 ZIP 程序中打开 JAR。
  • 谢谢,我将使用 java.util.zip.ZipFile 来查看是否可以以编程方式检查(请参阅使用 jar 工具运行这些选项的修改后的堆栈跟踪添加)。
  • @CodeChimp t用于“列出 JAR 文件的内容”,正如您在 docs.oracle.com/javase/tutorial/deployment/jar/view.html 中看到的那样,因此它不会测试内容的校验和(尽管它需要更加有效jar 以列出条目)。

标签: java jakarta-ee jar classpath


【解决方案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文件无效,在实例化ZipFile对象时会抛出ZipException

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-27
  • 2015-11-15
  • 2020-02-10
  • 2015-09-30
  • 1970-01-01
相关资源
最近更新 更多