Domanda

Sono stato a guardare questo problema per ore ormai. Ogni aiuto è apprezzato.

Ho scritto il codice che utilizza il decompilatore Jode dal "file jar jode embedded". Voglio usare questa versione perché è sotto Lesser GNU Public License.

Decompiler d = new Decompiler();
try {
    FileWriter fw = new FileWriter("c:\\jode.txt");

    d.setClassPath("C:\\mycode");

    ProgressListener p = new ProgressListener() {

        public void updateProgress(double arg0, String arg1) {
            System.out.println("inside of progress listener with arg0 = " +arg0+ " and arg1 = " +arg1);
        }
    };

    d.decompile("Test.class" , fw, p);

} catch (Exception ex) {
    ex.printStackTrace();
}

e ottengo sempre:

Exception in thread "main" java.lang.NoClassDefFoundError: Test.class
        at jode.bytecode.ClassInfo.loadInfo(ClassInfo.java:620)
        at jode.decompiler.ClassAnalyzer.<init>(ClassAnalyzer.java:86)
        at jode.decompiler.ClassAnalyzer.<init>(ClassAnalyzer.java:123)
        at jode.decompiler.Decompiler.decompile(Decompiler.java:191)
        at testdecompiler.Main.main(Main.java:45)

Se io uso

jode.decompiler.Main.decompile(...)

le cose funzionano -. Ma non possono utilizzare questo file di classe, perché risiede nella jode.jar che è soltanto GPL

È stato utile?

Soluzione

Sono stato in grado di riprodurre il problema con tutte le diverse versioni binarie di jode che sono disponibili dal loro sito web. Quando ho costruito una nuova versione del jode utilizzando la linea principale da svn, ha funzionato bene. Ho visto anche una voce in uno dei forum Jode in cui un utente si è lamentato il problema NoClassDefFound. Il suo caso sembrava un po 'diversa, ma lo sviluppatore jode ha suggerito che egli usa la linea principale da SVN al posto del binario prebuild.

Altri suggerimenti

d.setClassPath("C:\\mycode");

Questo percorso di classe sembra terribilmente breve per me.

Questa è una supposizione, come io non voglia me stesso con le classi decompilazione, ma penso che u dovrebbe usare

d.decompile("Test" , fw, p);

al posto di quello che u sta utilizzando ora. Questo potrebbe essere simile a

Class.forName("ClassName")

senza il suffisso "classe".

Aggiornamento: La mia ipotesi iniziale era sbagliato, e al male, l'eccezione / messaggio originale viene gettato via, per quanto un posso vedere. Il codice in cui JODE non assomiglia a questo:

 try {
      DataInputStream input = new DataInputStream
          (new BufferedInputStream
           (classpath.getFile(name.replace('.', '/') + ".class")));
        read(input, howMuch);            

  } catch (IOException ex) {
        String message = ex.getMessage();
      if ((howMuch & ~(FIELDS|METHODS|HIERARCHY
                       |INNERCLASSES|OUTERCLASSES)) != 0) {
          throw new NoClassDefFoundError(name);
        }

Dato che un'IOException deve essere gettato per ottenere il NoClassDefFound, controllare nulla per quanto riguarda la vostra subsytsem IO, ad esempio, il file.encoding. Credo che si dovrebbe correggere JODE per ottenere il messaggio di errore dettagliato o di debug a questo punto.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top