Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何检查jar文件是否有效?_Java_Jakarta Ee_Jar_Classpath - Fatal编程技术网

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

Java 如何检查jar文件是否有效?,java,jakarta-ee,jar,classpath,Java,Jakarta Ee,Jar,Classpath,我的webapp允许用户上传jar文件。然而,在上传jar文件之后,它就被破坏了。我通过比较md5校验和(winmd5free)验证了这一点 上传的jar文件看起来“正常”和“正确” 与原始文件相比,文件大小看起来正确(KB级别) 我可以使用7z打开上传的jar文件并查看其内容(资源和类文件),与原始文件相比,一切都是一样的 当我打开上传的jar文件(使用Notepad++)时,我注意到二进制内容与原始内容不同。另外,当我使用JarInputStream读取jar条目时,没有条目 JarIn

我的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());
}
此外,当我双击jar(Windows)时,我得到以下消息

错误:文件无效或损坏

我的问题是

  • 有没有办法通过编程检查jar文件是否有效?我本来希望JarInputStream能够立即检测到这一点,但它显示出一点问题都没有
  • 当我在windows中双击jar文件时,是否是java.exe给了我无效或损坏的jar文件消息
  • 为什么当一个无效的jar文件作为类路径的一部分传入时,不会引发错误/异常?e、 g.java-cp upload.jar;libs*com.some.class.Test
请注意,这与jar签名和/或检查jar签名无关。它只是检查一个文件(上传与否)是否是有效的jar文件(不一定是jar的类文件是否有效,因为已经有关于这个问题的另一篇SO文章)

运行结果

jar-tvf upload.jar

java.util.zip.ZipException:打开zip文件时出错
位于java.util.zip.ZipFile.open(本机方法)
位于java.util.zip.ZipFile。(ZipFile.java:127)
位于java.util.zip.ZipFile(ZipFile.java:88)
位于sun.tools.jar.Main.list(Main.java:977)
位于sun.tools.jar.Main.run(Main.java:222)
位于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();
    }
}
publicstaticvoidmain(字符串[]args){
如果(参数长度<1){
System.err.println(“需要jar文件”);
返回;
}
字符串路径名=args[0];
试一试{
ZipFile文件=新ZipFile(新文件(路径名));

枚举在命令行上,像这样运行jar命令:
jar-tvf
。't'表示“test”,我认为'v'表示“verbose”,而'f'表示“file”。您也可以在任何ZIP程序中打开jar。谢谢,我将使用java.util.ZIP.ZipFile查看是否可以通过编程方式进行检查(请参阅使用jar工具运行这些选项时修改的堆栈跟踪添加)。@CodeChimp
t
用于“列出jar文件的内容”,如中所示,因此它不会测试内容的校验和(尽管它需要是一个更有效的jar来列出条目)。是另一个选项。
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();
    }
}