3 Stimmen

Wie extrahiert man .class-Dateien aus einem verschachtelten Jar?

Ich habe eine Jar-Datei mit dem Namen " OuterJar.jar ", das ein anderes jar mit dem Namen " InnerJar.jar "Dieses InnerJar enthält 2 Dateien namens " Test1.class " & " Test2.class "Jetzt möchte ich diese beiden Dateien extrahieren. Ich habe einige Codes ausprobiert, aber es funktioniert nicht.

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();

Aber das Problem ist, dass die "jarFile" obj die obj der OuterJar-Datei ist, so dass beim Versuch, die inputStream einer Datei, die in der InnerJar existiert nicht möglich ist.

4voto

WhiteFang34 Punkte 69056

Sie müssen eine zweite JarInputStream um die inneren Einträge zu verarbeiten. Dies tut, was Sie wollen:

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();
        }
    }
}

2voto

Andrew Thompson Punkte 166383

Extrahieren Sie die InnerJar.jar und extrahieren Sie dann die Klassendateien daraus.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X