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

API standards et tierces Java Discussion :

Chargement de classe


Sujet :

API standards et tierces Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    187
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 187
    Par défaut Chargement de classe
    Bonjour !

    J'ai un problème assez compliqué à expliquer au chargement d'une classe contenue dans un fichier jar, je vais essayer d'être clair quand même...

    J'ai un projet qui définit une classe GenericPlugin (Qui contient les méthodes minimales de tous les plugins de ce projet)...

    J'ai un second projet (qui contient les classes necessaires à mon plugin de test) qui définit une classe systeme.Main qui hérite de GenericPlugin...

    Jusque là tout va bien je crée ensuite un jar de mon plugin en précisant la main-class dans le manifest.

    ça se complique dans mon premier projet quand je veux récupérer mon plugin... je cherche les jar d'un répertoire, quand j'en trouve un, je lis le manifest, je récupère la main class et je la charge avec le 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
    JarFile fichierJar = new JarFile(fichier);
    Manifest manifest = fichierJar.getManifest();
    Attributes attributes = manifest.getMainAttributes();
    if(attributes.containsKey(Attributes.Name.MAIN_CLASS)){
        String mainClass = attributes.getValue(Attributes.Name.MAIN_CLASS);
        URL urlList[] = {fichier.toURL()}; 
        ClassLoader loader = new URLClassLoader(urlList); 
        Class classe = Class.forName(mainClass,true,loader);
        Method[] methodes = classe.getMethods();
        for (int j = 0;j<methodes.length;j++){
    	System.out.println(methodes[j].getName());
        }
    }
    System.out.println(classe.getSuperclass());
    Quand j'exécute de code, je me retrouve avec la trace suivante dans la console :

    main
    hashCode
    getClass
    wait
    wait
    wait
    equals
    notify
    notifyAll
    toString
    class java.lang.Object

    bref, ma classe mère GenericPlugin a disparue (Vu que ma superclass est class java.lang.Object), les méthodes de ma classe plugin ont également disparues....

    mon fichier manifest est comme ça :

    Manifest-Version: 1.0
    Created-By: 1.4.2_08 (Sun Microsystems Inc.)
    Main-Class: systeme.Main

    Et la classe de mon plugin (J'ai décompilé la classe qui était dans le jar qui est lu par l'autre projet)

    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
    package systeme;
    import java.awt.MenuItem;
    import java.io.PrintStream;
    import plugin.GenericPlugin;
     
    public class Main extends GenericPlugin
    {
     
        public Main()
        {
        }
     
        public MenuItem getMenu()
        {
            return null;
        }
     
        public void afficher()
        {
            System.out.println("Chronoz");
        }
     
        public void zzz()
        {
            System.out.println("Chronoz");
        }
    }
    les methodes afficher() et getMenu() sont les méthodes abstraites de la classe GenericPlugin, les autres sont définies ici

    voilà si quelqu'un a une idée de piste, parceque là, je sèche un peu

    Merci d'avance

  2. #2
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    possible que tu charge un ancien jar et non pas celui que tu pense Quand on joue avec les plugin ca arrive souvent de se trouver à se casser la tête sur une vieille crasse qui trainanait. Class.getMethods() doit te retourner toutes les méthodes publiques de ton objet ou déclencher un exception si la classe charge pas. si t'as qu'une partie des méthodes... c'est qu'il y a qu'une partie des méthodes dans ton jar. Sinon j'ai l'impression que tu chipote beaucoup pour tes plugins. Normalement on fait un truc dans ce genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    pluginClassLoader= new URLClassLoader(pluginURLs);
    String classeDuPlugin=.... //méthode généralement basée sur le système des services, example le framework Discovery de jakarta commons plutot que de jouer avec un main
    GenericPlugin plugin = (GenericPlugin)pluginClassLoader.findClass(classeDuPlugin).newInstance();

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    187
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 187
    Par défaut
    Merci pour cette réponse,
    mon jar était bon ( Le code de ma classe Main que j'ai donné dans mon premier post était le résultat de la décompilation du .class présent dans le jar chargé) par contre il devait y avoir un problème dans mon code vu que ça marche très bien avec le tiens !

    Je me retrouve donc au final avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    JarFile fichierJar = new JarFile(fichier);
    Manifest manifest = fichierJar.getManifest();
    Attributes attributes = manifest.getMainAttributes();
    if(attributes.containsKey(Attributes.Name.MAIN_CLASS)){
        URL urlList[] = {fichier.toURL()}; 
        PluginLoader pluginClassLoader = new PluginLoader(urlList); 
        String mainClass = attributes.getValue(Attributes.Name.MAIN_CLASS);
        GenericPlugin plugin = (GenericPlugin)pluginClassLoader.getClass(mainClass).newInstance();
        plugin.afficher();
    }else{
        System.out.println("Le jar ne contient pas d'attribut Main-class : "+fichier.getAbsolutePath());
    }
    avec ma classe PluginLoader ressemblant à ceci :

    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
    package systeme;
     
    import java.net.URL;
    import java.net.URLClassLoader;
     
    public class PluginLoader extends URLClassLoader {
     
    	public PluginLoader(URL[] urlList) {
    		super(urlList);
    	}
     
    	public Class getClass(String className) throws ClassNotFoundException{
    		return findClass(className);
    	}
    }
    voilà je me retrouve avec quelque chose qui fonctionne mais je vais quand même aller jeter un oeil du côté de Discovery de jakarta commons... merci encore !

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 16/04/2009, 01h43
  2. Chargement de classe via dlopen
    Par Higestromm dans le forum C++
    Réponses: 4
    Dernier message: 18/05/2006, 16h14
  3. [Applet] Problème chargement de classe
    Par simsky dans le forum Applets
    Réponses: 1
    Dernier message: 08/05/2006, 19h31
  4. [SunOne] Problème de chargement de classe Xerces sous SunOne
    Par cocula dans le forum Glassfish et Payara
    Réponses: 3
    Dernier message: 11/01/2006, 15h46
  5. [Chargement de classe][noms de classe relatifs]
    Par freudy dans le forum Langage
    Réponses: 5
    Dernier message: 21/04/2004, 11h36

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