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

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

上传的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()); } 

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

错误:jarfile无效或损坏

我的问题是

  • 有没有办法以编程方式检查jar文件是否有效? 我本来希望JarInputStream立即检测到它,但它根本没有显示任何问题
  • 当我双击jar文件时,在Windows中,java.exe是否给了我无效或损坏的jar文件消息?
  • 如何在类路径中传入无效的jar文件时,不会抛出错误/exception? 例如java -cp uploaded.jar; libs * com.some.class.Test

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

跑步的结果

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.(ZipFile.java:127) at java.util.zip.ZipFile.(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 e = file.entries(); while(e.hasMoreElements()) { ZipEntry entry = e.nextElement(); System.out.println(entry.getName()); } } catch(Exception ex) { ex.printStackTrace(); } } 

如果jar文件无效,则在实例化ZipFile时将抛出ZipException。