2013-10-09 1 views
0

Я хочу получить всю файловую структуру файла jar в виде дерева. Я нахожу много решений. Я использую его как zip-файл. Я по ссылке How to get names of classes inside a jar file?Как получить всю структуру файла как дерево, когда в этом файле jar есть файлы jar.

Код выглядит следующим образом:

public void getClassFromJar(String path) throws IOException { 

    //ArrayList<String> classNames=new ArrayList<String>(); 
    ZipInputStream zip=new ZipInputStream(new FileInputStream(path)); 
    IntoEntry(zip); 

    //return classNames; 
} 

public void IntoEntry(ZipInputStream zip) throws IOException { 

    for(ZipEntry entry=zip.getNextEntry();entry!=null;entry=zip.getNextEntry()) { 
     System.out.println("entry: "+entry.getName()); 
     if (entry.getName().endsWith(".jar")) { 
      // How to do 

     } 

     if(entry.getName().endsWith(".class") && !entry.isDirectory()) { 
      // This ZipEntry represents a class. Now, what class does it represent? 
      StringBuilder className=new StringBuilder(); 
      for(String part : entry.getName().split("/")) { 
       if(className.length() != 0) { 
        className.append("."); 
       } 
       className.append(part); 
       if(part.endsWith(".class")) { 
        className.setLength(className.length()-".class".length()); 
       } 
      } 
      classNames.add(className.toString()); 
     } 
    } 

} 

Результат от D:\work\workspace\myjar\org.objectweb.asm_2.2.2.jar(It is not in classpath.) печати по System.out.println ("запись:" + entry.getName());:

entry: output/ 
entry: output/dist/ 
entry: output/dist/lib/ 
entry: output/dist/lib/asm-2.2.2.jar 
entry: output/dist/lib/asm-analysis-2.2.2.jar 
entry: output/dist/lib/asm-attrs-2.2.2.jar 
entry: output/dist/lib/asm-commons-2.2.2.jar 
entry: output/dist/lib/asm-tree-2.2.2.jar 
entry: output/dist/lib/asm-util-2.2.2.jar 
entry: plugin.xml 

Как пройти в банку файлы в этом банке файл?

ответ

0

Вы можете попробовать:

public static void printJarContent(File jarFile) { 
    java.util.jar.JarFile jar = new java.util.jar.JarFile(jarFile); 
    java.util.Enumeration enum = jar.entries(); 
    while (enum.hasMoreElements()) { 
     java.util.jar.JarEntry file = (java.util.jar.JarEntry) enum.nextElement(); 
     // temp directory where the jar will be extracted 
     java.io.File f = new java.io.File(DEST_DIR + java.io.File.separator + file.getName()); 
     String ext = Files.probeContentType(f.toPath()); 
     if(ext.equalsIgnoreCase("jar")) { 
      // extract current nested jar to a DEST_DIR and then 
      printJarContent(f);  
     } 
    java.io.InputStream is = jar.getInputStream(file); // get the input stream 
    while (is.available() > 0) { 
     //print out the (is.read()) or do whatever you want with it 
    } 
    is.close(); 
} 
+0

'jarFile' является' D: \ работа \ рабочее место \ myjar \ org.objectweb.asm_2.2.2.jar'. что такое 'destDir'? –

+0

Можете ли вы дать мне больше комментариев или объяснений о вашем методе? @aviad thanks –

+0

Игнорировать destDir (грязное копирование). Я не тестировал его, но вы можете получить представление о том, как сканировать содержимое jar, рекурсивно повторяя перечисление записей jar, в то время как некоторые записи могут быть самими файлами jar. – aviad

Смежные вопросы