Question

J'ai les yeux fixés sur cette question depuis des heures. Toute aide est appréciée.

J'écrit le code qui utilise le décompilateur Jode du « fichier jar Jode intégré ». Je veux utiliser cette version, car il est sous la licence publique GNU.

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

et je reçois toujours:

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)

Si j'utilise

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

choses fonctionnent -. Mais je ne peux pas utiliser ce fichier de classe, car il réside dans le jode.jar qui est seulement GPL

Était-ce utile?

La solution

J'ai pu reproduire le problème avec toutes les différentes versions binaires de Jode qui sont disponibles sur leur site web. Quand je construit une nouvelle version de Jode en utilisant la ligne principale de svn, il a bien fonctionné. J'ai vu aussi une entrée dans l'un des forums de Jöde où un utilisateur se plaignait du problème noClassDefFound. Son cas semblait un peu différent, mais le développeur de Jode a suggéré qu'il utilise le réseau principal de svn au lieu du binaire prebuild.

Autres conseils

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

Cette classpath semble terriblement courte pour moi.

Ceci est une supposition, que je ne me crois avec des classes décompilation, mais je pense que u devrait utiliser

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

au lieu de ce que u utilisent maintenant. Cela pourrait être similaire à

Class.forName("ClassName")

sans le suffixe "class".

Mise à jour: Mon hypothèse initiale a eu tort, et mauvais, i l'exception / message d'origine est jeté, en ce qui a peut voir. Le code où ne JODE ressemble à ceci:

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

Depuis un IOException doit être jeté pour obtenir le noClassDefFound, vérifier quoi que ce soit au sujet de votre IO subsytsem, par exemple le file.encoding. Je suppose que vous devez patcher JODE pour obtenir le message d'erreur détaillé ou débogage à ce point.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top