Разархивируйте вложенные jar-файлы java - PullRequest
0 голосов
/ 03 июля 2018

Я пытаюсь распаковать все файлы 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 голосов
/ 03 июля 2018

Алгоритм мне кажется нормальным. Похоже, ошибка вызвана тем, что разархивированный файл не является каталогом (а файлом) или не существует. Ваш метод unzip() не создает исключений, если разархивировать файл .jar не удалось из-за того, что выходной файл уже существует.

Вы ранее выполняли код, который мог привести к тому, что .jars или каталоги содержат нежелательные выходные файлы с тем же именем?

Перед вызовом FileUtils.listFiles(), проверьте, является ли корневой File объект на самом деле каталогом и существует (или это файл, но не каталог) с помощью File.isDirectory () или File.isFile () .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...