【发布时间】: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 <jarname>。 '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