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

Langage Java Discussion :

Classloaders et réflexivité


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite
    Inscrit en
    Mars 2006
    Messages
    848
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Mars 2006
    Messages : 848
    Par défaut Classloaders et réflexivité
    Bonjour,

    J'ai un gros problème d'utilisation de la réflexivité dans un contexte comprenant plusieurs classloaders.

    Pour être précis:
    - j'ai un module A dans un classloader A qui permet de lire du XML et de le traduire en objet Java,
    - j'ai un module B dans un classloader B qui appelle le module A pour lire des fichiers XML.

    Le problème vient du fait que le module A utilise la réflexivité pour savoir comment désérialiser le XML. Le mapping se fait via des annotations sur les champs de la classes Java.
    (Ceux qui connaissent ont dû se douter que je parle de SimpleXML...)

    Deux obstacles me bloquent pour l'instant:
    - Les annotations que trouve le module A ne sont pas celles qu'il attend puisqu'elles ont été chargées par un classloader différent (qui n'est pas un parent). Résultat : il considère que la classe n'a pas d'annotations et n'arrive pas à affecter les champs,
    - L'objet à déserialiser contient des Enum (sans plus de précision). La class Enum comprenant les valeurs à déserialiser se trouve dans le module B et n'existe pas dans le module A. Donc il n'arrive pas non plus à m'initialiser le champ (dans le cas où j'arrive à contourner salement le premier point).

    Avez-vous une idée dont on gère la réflexivité quand on a plusieurs classloaders (genre, dans OSGi...)?

    D'avance, merci

  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
    Ni l'un ni l'autre n'est parent de l'autre. Parce que si c'est le cas, l'architecture et curieuse et je me demande comment B arrive à appeler le parseur dans A....

  3. #3
    Membre expérimenté Avatar de DarkMolo
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    207
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Maroc

    Informations forums :
    Inscription : Juillet 2006
    Messages : 207
    Par défaut
    Bonjour,

    J'ai eu une fois besoin d'utiliser différents classloader, chacun pour un module, j'obtenais les mêmes problèmes que tu viens de citer, tournant en rond, ce que j'avais fait viole peut-être le principe initiale de l'application, comme quoi elle doit rester modulaire, qu'un module doit fonctionner sans les autres...

    J'avais créé un ClassLoader global au démarrage de l'application, un ClassLoader qui serait rendu accessible au reste de l'application, comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    URL[] urlModules = new URL[modules.length];
    int iCnt = 0;
    for (File fileIt : modules) {
    	urlModules[iCnt++] = fileIt.toURL();
    }
    ClassLoader globalClassLoader = new URLClassLoader(urlModules, parentClassLoader);
    En espérant que nous parlons bien de la même chose .

  4. #4
    Membre émérite
    Inscrit en
    Mars 2006
    Messages
    848
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Mars 2006
    Messages : 848
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    Ni l'un ni l'autre n'est parent de l'autre. Parce que si c'est le cas, l'architecture et curieuse et je me demande comment B arrive à appeler le parseur dans A....
    Il s'agit d'OSGi, chaque module (bundle) est chargé dans un classloader différent.
    Ensuite, des liens (Wire) sont établis entre les classloader pour satisfaire les dépendances (qui sont déclarées dans le Manifest).

    En fouillant dans les classloaders, je me suis rendu compte que la librairie que j'utilise semble se baser sur le ContextClassLoader. Or j'ai cru comprendre qu'aucune garantie n'est faite sur ce dernier dans un contexte OSGi.

    Du coup, la classe Toto du classloader B et celle que le module A trouve depuis le contextClassLoader ne sont pas les mêmes (bien qu'elles proviennent de la même source).

    A priori, une solution peut donc être de positionner le contextClassLoader avant chaque appel puis rétablir l'ancien, mais cela ne me plaît guère car je ne peux pas le généraliser à cause des Enum.

  5. #5
    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
    je ne sais pas comment OSGI marche ni fait le "wire" entre les dépendances, désolé. mais c'est justement ce que je suggérerais, passer le classloader à utiliser en question.

Discussions similaires

  1. Réponses: 4
    Dernier message: 16/04/2009, 01h43
  2. [ClassLoader][Image] issue d'un jar en constante
    Par julp dans le forum Entrée/Sortie
    Réponses: 3
    Dernier message: 23/04/2007, 23h58
  3. [Classpath][Classloader]Chargement dynamique de classes
    Par vberetti dans le forum Général Java
    Réponses: 9
    Dernier message: 08/07/2005, 12h11
  4. [Classloader]Probleme avec une applet
    Par punx120 dans le forum Applets
    Réponses: 3
    Dernier message: 04/06/2005, 18h43
  5. [ClassLoader]icones non visibles
    Par phil_ma dans le forum Général Java
    Réponses: 4
    Dernier message: 19/01/2005, 20h09

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