[ClassLoader]Incompatible magic value 0 in class file package/classe [Résolu]

Signaler
Messages postés
764
Date d'inscription
jeudi 27 juillet 2006
Statut
Membre
Dernière intervention
6 septembre 2010
-
Messages postés
764
Date d'inscription
jeudi 27 juillet 2006
Statut
Membre
Dernière intervention
6 septembre 2010
-
Salut à tous et à toutes

j'essaye de charger toutes les classes que contient un jar..
voici mon code :

import java.util.jar.*;



import



java.util.zip.*;




import



java.io.*;




import



java.util.*;

class JarLoader extends ClassLoader {
   
    /* Attributs privés */
    private String jarName;
   



private




Hashtable<



String



, Integer> jarMap = new



Hashtable



<



String



,



Integer



>();
   
    /* Constructeur */
    public JarLoader(



String



name) {
        this.jarName = name;
    }
   
   



public




void makeEntryList() throws IOException {
        ZipFile zf =



new



ZipFile(jarName);
        Enumeration<? extends ZipEntry> e = zf.entries();
        ZipEntry ze;

        while (e.hasMoreElements()) {
            ze = e.nextElement();
            jarMap.put(ze.getName(), (int)ze.getSize());
        }
    }
   
   



public




void



loadClasses()



throws




IOException, ClassNotFoundException {
        JarInputStream jis = null;
        try {
            jis =



new




JarInputStream(



new




FileInputStream(jarName));
            Enumeration<



String



> keys = jarMap.keys();
           



while



(keys.hasMoreElements()) {
                String entry = keys.nextElement();
                // s'il ne s'agit pas d'une classe java, on passe
                if (entry.endsWith(".class") == false) {
                    jis.skip(jarMap.get(entry));
                }
                else {
                    // il s'agit d'une classe java : on récupère son ByteCode
                   



String



className = entry.substring(0, entry.indexOf(".")).replace("/", ".");
                    int classSize = jarMap.get(entry);
                    byte byteCode[] =



new




byte



[classSize];
                    jis.read(byteCode, 0, classSize);
                    defineClass(className, byteCode, 0, classSize);
                    loadClass(className);
                }
            }
        }
        finally {
            jis.close();
        }
    }
   
   



public




static void main(



String



[] args)



throws




Exception {
        JarLoader jarLoader = new JarLoader("leJar.jar");
        jarLoader.makeEntryList();
        jarLoader.loadClasses();
       
        Class.forName("classexplorer.Fenetre");
    }
}



le problème c'est que j'obtiens toujours cette exception :
Exception in thread "main" java.lang.ClassFormatError: Incompatible magic value 0 in class file classexplorer/Main
(Main est la dernière classe qui se trouve dans le jar)

Merci d'avance..

_____________________
Vos avis et critiques sur le livre "Objets réactifs en java" de Frédéric Boussinot : contactez moi par MP..

3 réponses

Messages postés
764
Date d'inscription
jeudi 27 juillet 2006
Statut
Membre
Dernière intervention
6 septembre 2010
18
Salut,

il fallait utiliser un URLClassLoader et la méthode loadClass(String className) au lieu de lire le byteCode manuellement..

voici un code fonctionnel :



try
{

JarFile jarFile = new JarFile(srcPath);
Enumeration<JarEntry> entries = jarFile.entries();
String url = "file:" + srcPath;
System.out.println(url);
URLClassLoader classLoader = new URLClassLoader(
new URL[]{new URL(url)});
while(entries.hasMoreElements()){
JarEntry jarEntry = (JarEntry) entries
.nextElement();
String classPath = jarEntry.getName();
if(classPath.endsWith(".class")){
String className = classPath.replace("/", ".")
.substring(0, classPath.length() - 6);
try{
Class clazz = classLoader
.loadClass(className);
//Et là, tu fais ce que tu vexu avec la classe
}catch(ClassNotFoundException e1){
e1.printStackTrace();





source..





_____________________
Vos avis et critiques sur le livre "Objets réactifs en java" de Frédéric Boussinot : contactez moi par MP..
Messages postés
764
Date d'inscription
jeudi 27 juillet 2006
Statut
Membre
Dernière intervention
6 septembre 2010
18
désolé pour la mise en forme..

String jarPath = "archive.jar";
try {
     JarFile jarFile = new JarFile(jarPath);
      String url = "file:" + jarPath;
      URLClassLoader classLoader = new URLClassLoader(new URL[] {new URL(url)});

      Enumeration<JarEntry> entries = jarFile.entries();
     while (entries.hasMoreElements()) {
          JarEntry entry = entries.nextElement();
          String classPath = entry.getName();
          if (classPath.endsWith(".class")) {
              String className = classPath.replace("/", ".").substring(0, classPath.length()-6);
              try {
                   Class c = classLoader.loadClass(className);
                   // là on fait ce qu'on veut de la classe
              catch (ClassNotFoundException e) {
                    e.printStackTrace();
              }
           }
      }
}
catch (IOException e) {
      e.printStackTrace();
}


_____________________
Vos avis et critiques sur le livre "Objets réactifs en java" de Frédéric Boussinot : contactez moi par MP..
Messages postés
764
Date d'inscription
jeudi 27 juillet 2006
Statut
Membre
Dernière intervention
6 septembre 2010
18
Re,

l'étrange c'est que je me contente de catcher l'exception provoquée par

jarLoader.loadClasses();

et ça marche !






_____________________
Vos avis et critiques sur le livre "Objets réactifs en java" de Frédéric Boussinot : contactez moi par MP..