IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Java Discussion :

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


Sujet :

Java

  1. #1
    Membre averti Avatar de Chatbour
    Profil pro
    Étudiant
    Inscrit en
    septembre 2006
    Messages
    431
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : septembre 2006
    Messages : 431
    Points : 305
    Points
    305
    Par défaut [ClassLoader]Incompatible magic value 0 in class file package/classe
    bonjour à tous et à toutes

    j'essaye de charger toutes les classes que contient un jar..
    voici mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    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..

  2. #2
    Expert éminent
    Avatar de djo.mos
    Profil pro
    Inscrit en
    octobre 2004
    Messages
    4 666
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : octobre 2004
    Messages : 4 666
    Points : 7 679
    Points
    7 679
    Par défaut
    Salut,
    Je ne suis pas sûr d'où vient le problème (appramment le bytecode que tu construis depuis le jar est corrompu ...), mais voici une méthode pour retrouver et charger toutes les classes d'un jar:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    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();
    			}
    		}
    	}
    } catch (IOException e1) {
    	e1.printStackTrace();
    }
    Faut juste faire gaffe que même si tu charges une classe du jar (via le classLoader.loadClass), si quoi que ce soit de la classe chargée (méthode, champ) dépend d'une classe d'un autre jar, et que tu essais de le retrouver (via getMethods par exemple, ça va lancer un CNFE. Faut donc mettre le ty/catch(CNFE) aussi près que possible de tes manipulation ET à l'intérieur des intérations

  3. #3
    Membre averti Avatar de Chatbour
    Profil pro
    Étudiant
    Inscrit en
    septembre 2006
    Messages
    431
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : septembre 2006
    Messages : 431
    Points : 305
    Points
    305
    Par défaut
    Merci beaucoup djo.mos

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 19/07/2014, 09h06
  2. Incompatible magic value 1281977963
    Par Ceubex dans le forum Applets
    Réponses: 0
    Dernier message: 21/05/2014, 13h54
  3. Réponses: 3
    Dernier message: 12/11/2012, 14h03
  4. class pour table + class pour td = class td non fonctionnelle ?
    Par supergrey dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 28/05/2009, 08h13
  5. [Débutant][JNDI] Erreur "bad class file"
    Par giffle dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 05/01/2005, 10h23

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo