How can I check if a JAR file is valid?(如何检查JAR文件是否有效?)
问题描述
My WebApp允许用户上传JAR文件。但是,上载JAR文件后,它会被损坏。我已经通过比较上传文件(Winmd5free)前后的MD5校验和来验证这一点。
上传的JAR文件与原始JAR文件几乎相同:
- 文件大小与原始文件相似(以KB为单位)
 - 我可以使用解压程序打开上传的JAR文件并查看其内容(资源和类文件),与原始文件相比一切都是一样的
 
当我打开上传的JAR文件(使用记事本++)时,我确实注意到二进制内容与原始内容不同。此外,当我使用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文件的方法是使用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。
这篇关于如何检查JAR文件是否有效?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:如何检查JAR文件是否有效?
				
        
 
            
        - 获取数字的最后一位 2022-01-01
 - 未找到/usr/local/lib 中的库 2022-01-01
 - Eclipse 的最佳 XML 编辑器 2022-01-01
 - 在 Java 中,如何将 String 转换为 char 或将 char 转换 2022-01-01
 - 转换 ldap 日期 2022-01-01
 - 如何使 JFrame 背景和 JPanel 透明且仅显示图像 2022-01-01
 - GC_FOR_ALLOC 是否更“严重"?在调查内存使用情况时? 2022-01-01
 - java.lang.IllegalStateException:Bean 名称“类别"的 BindingResult 和普通目标对象都不能用作请求属性 2022-01-01
 - 如何指定 CORS 的响应标头? 2022-01-01
 - 将 Java Swing 桌面应用程序国际化的最佳实践是什么? 2022-01-01
 
						
						
						
						
						
				
				
				
				