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 :

problème de chargement de classe (plugin)


Sujet :

Java

  1. #1
    Membre du Club
    Inscrit en
    Juin 2003
    Messages
    205
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Juin 2003
    Messages : 205
    Points : 56
    Points
    56
    Par défaut problème de chargement de classe (plugin)
    Bonjour,

    J'ai un problème de chargement de classe (qui sont en faite des plugin).

    Dans un fichier plugin.txt, j'ai a chaque ligne le nom d'une classe (dc d'un plugin).

    Si je met la classe directement avec les autres fichiers de mon application je n'ai pas de problème mais si je met cette classe dans un dossier plugin/"nom de la classe"/"nom de la classe".class il me met l'erreur suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    java.lang.ClassNotFoundException: plugin/PluginWeb/PluginWeb
    	at java.lang.Class.forName0(Native Method)
    	at java.lang.Class.forName(Unknown Source)
    J'aimerai en faite que chaque plugin soit dans un dossier portant son nom.

    Voici 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
    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
    Class c = null;
    File source = new File("plugin.txt");
    File source = new File("plugin.txt");
    		
    try {
      InputStreamReader systemReader = new InputStreamReader(new FileInputStream(source));
      LineNumberReader reader = new LineNumberReader(systemReader);
      String line;
      while((line = reader.readLine())!=null) {
        NomPlugins.add("plugin/"+line+"/"+line);
        //NomPlugins.add(line);
        System.out.println(line+"|"+NomPlugins.size());
      }
    } catch( java.io.FileNotFoundException f ) {
    } catch( java.io.IOException e ) {
    }
       
    Iterator iterateur = NomPlugins.iterator();
    while(iterateur.hasNext()){
      String NomClass = (String) iterateur.next();
      try {
        System.out.println(NomClass);
        c = Class.forName(NomClass); 
        System.out.println(c);
      } 
      catch(ClassNotFoundException e) {   
        System.err.println("Classe "+NomClass+" non trouvée");  
        e.printStackTrace();
      }           
      try {   
        Object o = c.newInstance();      
        Plugins p = (Plugins) o;
        InstancePlugins.add(p);
      } 
      catch(InstantiationException e) {
      }    
      catch(IllegalAccessException e) {
      }  
    }
    Savez vous comment faire?

    Merci d'avance

    Nicodess

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    194
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 194
    Points : 234
    Points
    234
    Par défaut
    Ca dépend plus où moins de la manière avec laquelle ton appli et tes plugins sont distribués. Mais dans tous les cas, c'est une question de chemin d'accès.

  3. #3
    Membre du Club
    Inscrit en
    Juin 2003
    Messages
    205
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Juin 2003
    Messages : 205
    Points : 56
    Points
    56
    Par défaut
    J'ai mis sur le poste initial des partie de code en gras qui me parraissent les points ou il peut y avoir des problème.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    NomPlugins.add("plugin/"+line+"/"+line);
    //NomPlugins.add(line);
    j'ai essayé bien sur avec "./plugin/"+line+"/"+line et "/plugin/"+line+"/"+line mais ca ne marche pas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    c = Class.forName(NomClass);
    c'est ici qu'est générer l'erreur.

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    194
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 194
    Points : 234
    Points
    234
    Par défaut
    Donc ta méthode
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    NomPlugins.add("plugin/"+line+"/"+line);
    ajoute le chemin d'accès au répertoire plugin pour écrire un chemin absolu, ou bien ce répertoire se trouve sous la racine de ton application et tu utilises un chemin relatif, c'est bien ça ?

    hummm

    As-tu essayé d'afficher ce que tu récupères avec l'itérateur.

  5. #5
    Membre du Club
    Inscrit en
    Juin 2003
    Messages
    205
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Juin 2003
    Messages : 205
    Points : 56
    Points
    56
    Par défaut
    En fait, comme en ne mettant rien (sauf line qui contient juste le nom de la classe) il me charge bien mon plugin, je me suis dit que en mettant le chemin du dossier et le nom de la classe (cad "plugin/"+line+"/"+line) il allé bien me charger ma classe mais je pense que c = Class.forName(NomClass); ne veut que le nom d'une classe et ne veut pas de chemin en lus pour aceder a cette classe. Si c'est le cas, je ne sais pas comment lui dire que c'est dans un autre dossier.

    Nicodess

  6. #6
    Membre actif
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    194
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 194
    Points : 234
    Points
    234
    Par défaut
    Ce qui est bizarre dans ta construction, c'est ta classe NomPlugin. Je veux dire, quand tu appelles la méthode statique NomPlugin.add(line), à quoi est ajouté line ? J'ai du mal à y voir clair.

  7. #7
    Membre du Club
    Inscrit en
    Juin 2003
    Messages
    205
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Juin 2003
    Messages : 205
    Points : 56
    Points
    56
    Par défaut
    Bon j'ai épurer un peu le code et j'ai rajouter la déclaration de mes 2 ArrayList

    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
    private ArrayList InstancePlugins = new ArrayList();
    private ArrayList NomPlugins = new ArrayList();
    ...
    Class c = null;
    File source = new File("plugin/plugin.txt");
     
    try
    {
      InputStreamReader systemReader = new InputStreamReader(new FileInputStream(source));
      LineNumberReader reader = new LineNumberReader(systemReader);
      String line;
      while((line = reader.readLine())!=null)
      {
        NomPlugins.add(line);
        //NomPlugins.add("plugin/"+line+"/"+line);
        try
        {
          c = Class.forName("plugin/"+line+"/"+line);
        }
        catch (ClassNotFoundException e) 
        {
          System.err.println("Classe "+line+" non trouvée");
          e.printStackTrace();
        }
        try
        {   
          Object o = c.newInstance();      
          Plugins p = (Plugins) o;
          InstancePlugins.add(p);
        } 
        catch(InstantiationException e){ }    
        catch(IllegalAccessException e){ }
      }
    }
    catch( java.io.FileNotFoundException f ){ }
    catch( java.io.IOException e ){ }

  8. #8
    Membre du Club
    Inscrit en
    Juin 2003
    Messages
    205
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Juin 2003
    Messages : 205
    Points : 56
    Points
    56
    Par défaut
    bon je viens de retrouver le site qui m'a permis de m'inspirer : ici

    Dans la rubrique Utiliser le chargement dynamique pour faire des plugins il y a le point 3 qui m'interesse mais je ne voit pas comment faire dans mon cas:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Mettez Plugin1 dans le paquetage fr.unice.plugin et refaites exécuter Exemple3. Pour que le plugin soit trouvé il faut positionner 
    correctement ClasseD car forName délègue la recherche des classes au chargeur de classes 
    des applications. Ce chargeur de classes recherche dans le classpath, en tenant compte du nom du paquetage de la classe.
    Puvez vous m'éclairer?

    Merci d'avance

    Nicodess

  9. #9
    Membre actif
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    194
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 194
    Points : 234
    Points
    234
    Par défaut
    Citation Envoyé par nixonne
    bon je viens de retrouver le site qui m'a permis de m'inspirer : ici

    Dans la rubrique Utiliser le chargement dynamique pour faire des plugins il y a le point 3 qui m'interesse mais je ne voit pas comment faire dans mon cas:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Mettez Plugin1 dans le paquetage fr.unice.plugin et refaites exécuter Exemple3. Pour que le plugin soit trouvé il faut positionner 
    correctement ClasseD car forName délègue la recherche des classes au chargeur de classes 
    des applications. Ce chargeur de classes recherche dans le classpath, en tenant compte du nom du paquetage de la classe.
    Puvez vous m'éclairer?

    Merci d'avance

    Nicodess
    Oui, je me fais avoir à chaque fois. La méthode Class.forName() ne demande pas un chemin d'accès à un fichier .class mais le package où trouver cette classe. Le chemin d'accès à la racine du package doit être ajouté au CLASSPATH.

    Par exemple, admettons que tu n'ais pas encore jaré ton projet. Tes sources se trouvent dans quelque chose comme /home/workspace/Projet1/src. Tu dois donc placer ce répertoire dans le CLASSPATH de ton système ou utiliser une variable temporaire. Dans le cas du workspace, l'edi le fait automatiquement à la création du projet. Pour instancier une classe de Projet1, on précisera alors dans Class.forName() le sous-package de la classe, avec le séparateur ".". Par exemple : Class.forName("tools.PluginLoader").

    En revanche, comme le répertoire de tes plugins ne se trouvent pas dans les sources, il faut que tu l'ajoutes au CLASSPATH.

    Par ailleurs, si tes plugins sont placés dans des sous-répertoires, ils doivent le déclarer au préalable avec l'instruction package.

    Une autre possibilité, si tes plugins sont jarés, est de les placer dans JAVA_HOME/lib/ext/ (pas besoin de CLASSPATH).

Discussions similaires

  1. Problème de chargement de classe
    Par Schnuffel dans le forum Général Java
    Réponses: 2
    Dernier message: 27/06/2011, 15h54
  2. Problème de chargement de class
    Par benthebest dans le forum Entrée/Sortie
    Réponses: 6
    Dernier message: 06/10/2010, 17h16
  3. [JMS/JNDI] Problème de chargement de classe
    Par Erouan dans le forum Glassfish et Payara
    Réponses: 5
    Dernier message: 03/02/2010, 16h12
  4. [Applet] Problème chargement de classe
    Par simsky dans le forum Applets
    Réponses: 1
    Dernier message: 08/05/2006, 19h31
  5. [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

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