解压缩嵌套的jar文件Java

时间:2018-07-03 05:17:58

标签: java jar

我正在尝试解压缩所有jar文件和嵌套在jar文件中的jar文件。 例如,假设有一个Test.jar,并且在Test.jar的内部有Test1.jar, 我试图做的是建立一个临时目录并解压缩它们,当它是jar文件时,递归调用。

以下是我的代码和获得的日志。我对此一无所知。 我很确定输入是目录。我不知道如何解决此错误。另外,我非常确定错误是从这里(Collection<File> files = FileUtils.listFiles(root, null, recursive);

Curr directory:/Users/younghoonkwon/jar-analyzer
unzipping directory/Users/younghoonkwon/jar-analyzer/test1.jar@
Curr directory:/Users/younghoonkwon/jar-analyzer/test1.jar@
java.lang.IllegalArgumentException: Parameter 'directory' is not a directory
    at org.apache.commons.io.FileUtils.validateListFilesParameters(FileUtils.java:545)
    at org.apache.commons.io.FileUtils.listFiles(FileUtils.java:521)
    at org.apache.commons.io.FileUtils.listFiles(FileUtils.java:691)
    at org.vulnerability.checker.JarParser.unzipJars(JarParser.java:31)
    at org.vulnerability.checker.JarParser.unzipJars(JarParser.java:38)
    at org.vulnerability.checker.VulnerabilityChecker.main(VulnerabilityChecker.java:26)
[/Users/younghoonkwon/jar-analyzer/test1.jar]

我的代码:

public void unzipJars(String toFind, String currDirectory) {
    File root = new File(currDirectory);
    try {
        boolean recursive = true;
        System.out.println("Curr directory:"+root);
        Collection<File> files = FileUtils.listFiles(root, null, recursive);
        for (Iterator<File> iterator = files.iterator(); iterator.hasNext();) {
            File file = (File) iterator.next();
            if (file.getName().endsWith(toFind)) {
                if(toFind.endsWith("jar")) {
                    unzip(file.getAbsolutePath() + "@",file.getAbsolutePath());
                    System.out.println("unzipping directory"+ file.getAbsolutePath()+"@");
                    unzipJars("jar", file.getAbsolutePath()+"@");
                    this.jarList.add(file.getAbsolutePath());
                }
            }
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

static void unzip(String destDirPath, String zipFilePath) throws IOException {
    Runtime.getRuntime().exec("unzip "+ zipFilePath + " -d" + destDirPath);
}

1 个答案:

答案 0 :(得分:0)

该算法对我来说似乎还可以。该错误似乎是由于解压缩后的文件不是目录(而是文件)或它不存在引起的。如果由于已存在输出文件而无法解压缩.jar,则您的unzip()方法不会抛出任何异常。

您之前是否运行过代码,可能导致.jars或目录包含不需要的具有相同名称的输出文件?

在调用FileUtils.listFiles()之前,请File.isDirectory()或{{检查根File对象是否实际上是一个目录,并且该目录是否存在(或是否是文件而不是目录)。 3}}。