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

Eclipse Platform Discussion :

[Introspection] problème de NoClassDefFoundError


Sujet :

Eclipse Platform

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Novembre 2006
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 17
    Par défaut [Introspection] problème de NoClassDefFoundError
    Bonjour à tous, je poste ici mais je sais pas si c'est dans la bonne partie du forum (ne pas hésité à déplacer le post)

    bon, je vais essayer d'être clair... voici le contexte.

    Je en train de développer un projet Java RCP, j'ai un de mes plugin qui fait de l'introspection pour charger dynamiquement des classes (editor). Le souci c'est que ce plugin est isolé au niveau de ses dépendances (c'est volontaire). Ceci implique que au moment de l'éxécution de l'instruction Class.forName("leNomDeMaClass"); j'ai un beau NoClassDefFoundError.

    J'ai cru comprendre après quelques heures de recherches et de lecture que mon problème pouvait surement venir de mon ClassLoader. il faudrait que j'en redéfinisse un...

    Plus clairement, les classes que je souhaient instancier ne font pas parti du plugin mais sont chargées normalement avec l'application car l'éditeur fait parti de l'application... résultat, comme elle ne font pas parti du plug-in, il m'envoie bouler à l'éxécution de l'introspection

    Autre problème ! j'ai réussi à charger une de mes classes en lui indiquant le chemin absolu de la class via un classLoader (ce qui est bien) mais le problème, c'est quand j'aurais mon produit, je n'aurais plus la même structure de fichiers. Pour que ça marche, j'interogeais mon workSpace...

    Auriez vous des idées...? Dois-je chercher du côté de classLoader...? du côté de mon classPath...?

    Au passage dernière question, quand je lance mon produit, qu'est ce que j'ai en mémoire (je parle des classes) ? (ne devrais-je pas avoir les classes de mon éditeur...?)


    Voici le basiquement ce qui se passe :
    Plugin Présentation
    -Il contient mes éditeurs et mes vues
    Plugin d'introspection
    -Il contient un fichier.properties (ce dernier contient le nom absolu de mes éditeurs pour pouvoir les charger à partir de Class.forName(String))
    -Ma classe éxécutant l'introspection

    Ma vue 1 veut ouvrir mon editeur 1 :
    ->Ma vue 1 interroge ma classe d'introspection afin qu'elle signale à mon éditeur 1 de s'ouvrir.
    ->Ma classe d'introspection intéroge le fichier properties et connait donc le nom de l'éditeur à ourvir
    ->Ma classe d'introspection utilise Class.forName(NomAbsoluDeMonEditeur1) pour récupérer la classe de l'éditeur 1

    ça plante quand ma classe d'instropection fait Class.forName

    Voilà

    Merci d'avance

  2. #2
    Membre confirmé
    Inscrit en
    Juin 2007
    Messages
    151
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 151
    Par défaut
    J'avais un peu le meme probleme pour acceder a une classe d'un autre plugin (mais je n'ai pas le solution)

    Par contre, tu met bien le chemin relatif dans ton workspace que tu fait ton forName ?

    Par exemple si ta classe "maClasse" est dans le package "mesClassesDynamiques", tu dois indiquer forName("mesClassesDynamiques.maClasse").

  3. #3
    Membre averti
    Inscrit en
    Novembre 2006
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 17
    Par défaut
    oui pas de souci de ce côté là.

    Je me plonge dans le livre Eclipse RCP à la recherche d'informations...

    Sinon je me disais que le problème revient à avoir accès aux plugin chargés au démarage et donc aux classes de ces plugin (mais comment faire... )

    Si je trouve promis je poste la solution !

  4. #4
    Membre averti
    Inscrit en
    Novembre 2006
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 17
    Par défaut
    ça y est j'ai la solution

    Bon faut faire plusieurs choses :

    dans mon plugin isolé (appelons le plug1):

    Création d'un point d'extension avec les paramètres qu'il faut (pour créer son extension, vous pouvez éventuellement aller ici)
    Appelons ce point extensionBonus

    Ensuite sur chaque plugin dépendant de plug1, je leur met une dépendance vers mon point d'extension extensionBonus

    Ensuite pour pouvoir accès à ma classe depuis plug1, j'utilise la méthode suivante :
    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
    private static Class getControlerClass(String useCaseId, String className, String activatorName) throws Exception{
    		/*
    		 * We get the activator name in order to get back activator object
    		 * Indeed, when we have this object we can get the classLoader of
    		 * calling plugin so we can found our controler class. We do not directly get
    		 * the controler because all our controler have private constructor and the called 
    		 * process will invoke basic contructor on controler (the private)
    		 *
    		 * We load all plugins who manage useCaseExention
    		 */
    		IConfigurationElement[] decls = Platform.getExtensionRegistry().getConfigurationElementsFor(EXTENSION_POINT);
    		/*
    		 * We skim through the plugin in order to search the correct Activator
    		 */
    		for (int i = 0; i < decls.length; i++){
    			IConfigurationElement element = decls[i];
    			if (activatorName.equals(element.getAttribute("activatorClassName"))){
    						try{
    							/*
    							 * When we found the correct activator, we instanciate the object and 
    							 * use it's classLoader in order to found the controler class
    							 */
    							Object elementTest = element.createExecutableExtension("activatorClassName");
    							return elementTest.getClass().getClassLoader().loadClass(className);
    						}catch(CoreException e){
    							throw e;
    						} 
    						catch (ClassNotFoundException e) {
    							throw e;
    						}
    					}
    		}
    		/*
    		 * If no class was found then we generate a ClassNotFoundException
    		 */
    		ClassNotFoundException exception = new ClassNotFoundException("No class found for : "+useCaseId);
    		throw exception;
    	}
    Dans mon cas, je récupère l'activator du plugin appelant afin d'avoir son classLoader associé et donc ma class

    Une fois ma class récupérée, j'utilise l'introspection pour en faire ce que je veux.

    Et voilà le tour est joué

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

Discussions similaires

  1. problème de NoClassDefFoundError
    Par Nostalgeek dans le forum Général Java
    Réponses: 5
    Dernier message: 21/10/2010, 15h27
  2. [Framework] Problème ClassPathXmlApplicationContext NoClassDefFoundError
    Par Reno17 dans le forum Spring
    Réponses: 5
    Dernier message: 03/12/2009, 22h57
  3. Problème de NoClassDefFoundError pour un simple programme
    Par houpli dans le forum Débuter avec Java
    Réponses: 2
    Dernier message: 17/10/2008, 07h30
  4. problème d'introspection sous eclipse
    Par rainz dans le forum Eclipse Java
    Réponses: 4
    Dernier message: 13/05/2005, 16h33
  5. [Applet] NoClassDefFoundError problème
    Par raj dans le forum Applets
    Réponses: 8
    Dernier message: 28/12/2004, 12h52

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