Как извлечь файлы .class из вложенного Jar? - PullRequest
3 голосов
/ 26 апреля 2011

У меня есть файл JAR с именем " OuterJar.jar ", который содержит другой файл с именем " InnerJar.jar ", этот InnerJar содержит 2 файла с именем " Test1.class"&" Test2.class". Теперь я хочу извлечь эти два файла.Я попробовал какой-то кусок кода, но он не работает.

class NestedJarExtractFactory{

  public void nestedJarExtractor(String path){

    JarFile jarFile = new JarFile(path);


     Enumeration entries = jarFile.entries();

          while (entries.hasMoreElements()) {

           JarEntry  _entryName = (JarEntry) entries.nextElement();

                      if(temp_FileName.endsWith(".jar")){

        JarInputStream innerJarFileInputStream=new JarInputStream(jarFile.getInputStream(jarFile.getEntry(temp_FileName)));
        System.out.println("Name of InnerJar Class Files::"+innerJarFileInputStream.getNextEntry());
       JarEntry innerJarEntryFileName=innerJarFileInputStream.getNextJarEntry();
///////////Now hear I need some way to get the Input stream of this class file.After getting inputStream i just get that class obj through 
           JavaClass clazz = new ClassParser(InputStreamOfFile,"" ).parse();

}

///// I use the syntax 
  JavaClass clazz = new ClassParser(jarFile.getInputStream(innerJarEntryFileName),"" ).parse();

Но проблема в том, что объект "jarFile" является объектом файла OuterJar, поэтому при попытке получить inputStream файла, который существует в InnerJar, невозможно.

Ответы [ 2 ]

4 голосов
/ 26 апреля 2011

Вам нужно создать второй JarInputStream для обработки внутренних записей. Это делает то, что вы хотите:

FileInputStream fin = new FileInputStream("OuterJar.jar");
JarInputStream jin = new JarInputStream(fin);
ZipEntry ze = null;
while ((ze = jin.getNextEntry()) != null) {
    if (ze.getName().endsWith(".jar")) {
        JarInputStream jin2 = new JarInputStream(jin);
        ZipEntry ze2 = null;
        while ((ze2 = jin2.getNextEntry()) != null) {
            // this is bit of a hack to avoid stream closing,
            // since you can't get one for the inner entry
            // because you have no JarFile to get it from 
            FilterInputStream in = new FilterInputStream(jin2) {
                public void close() throws IOException {
                    // ignore the close
                }
            };

            // now you can process the input stream as needed
            JavaClass clazz = new ClassParser(in, "").parse();
        }
    }
}
2 голосов
/ 26 апреля 2011

Сначала извлеките InnerJar.jar, затем извлеките из него файлы классов.

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