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 :

chargeur de classe


Sujet :

Langage Java

  1. #1
    Inactif  
    Inscrit en
    Avril 2005
    Messages
    750
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 750
    Points : 498
    Points
    498
    Par défaut chargeur de classe
    Bonjour,

    Je voudrais pouvoir charger une classe au runtime (drivers jdbc), pour cela j'ai créé un chargeur de classe qui étend URLClassLoader, puis pouvoir utiliser cette classe avec mon DataSource qui lui est chargé par le system class loader. Le DataSource utilise Class.forName(ma.classe.chargée.Driver), donc cela ne fonctionne pas. Est ce que si je charge le DataSource avec mon URLClassLoader cela va fonctionné. Si non quelles seraient d'autres alternatives ?

    Merci de l'aide.

  2. #2
    Membre régulier
    Inscrit en
    Octobre 2006
    Messages
    108
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 108
    Points : 118
    Points
    118
    Par défaut
    Pourquoi as tu besoin de créer un class loader ?
    D'habitude, les drivers jdbc sont simplement chargés par le class loader normal lors de l'appel à Class.forName()

  3. #3
    Inactif  
    Inscrit en
    Avril 2005
    Messages
    750
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 750
    Points : 498
    Points
    498
    Par défaut
    Salut NicoV,

    En fait dans mon application je voudrais pouvoir utilisé n'importe quelle driver jdbc suivant la base de donnée que l'utilisateur va utiliser, ou même utiliser plusieurs base de données. Pour être chargé par le system class loader, j'aurai besoin de mettre les drivers jdbc de chaque base de données dans le classpath, ce qui n'est pas une bonne solution je pense. Chargé le driver dynamiquement est mieux dans mon cas non ?

  4. #4
    Membre averti
    Inscrit en
    Octobre 2007
    Messages
    311
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 311
    Points : 318
    Points
    318
    Par défaut
    La réponse m'intéresse également, car je pense qu'il va falloir que mon appli (un serveur) puisse charger des classes en dehors du jar et qui n'étaient pas dispo au lancement de l'appli...

  5. #5
    Membre régulier
    Inscrit en
    Octobre 2006
    Messages
    108
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 108
    Points : 118
    Points
    118
    Par défaut
    Que les classes soient dans le classpath n'empêche pas de les charger dynamiquement.

    Si tu veux créer ton ClassLoader, as-tu essayé de déléguer le defineClass() au system class loader ? Si je comprends bien comment çà marche, comme çà ta classe sera quand même associée au system class loader et pas à ton class loader perso.

  6. #6
    Inactif  
    Inscrit en
    Avril 2005
    Messages
    750
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 750
    Points : 498
    Points
    498
    Par défaut
    Ok merci a toi, je vais regardé du coté de defineClass() c'est peut être la solution. Je te tiens au courant.

  7. #7
    Modérateur
    Avatar de Alkhan
    Homme Profil pro
    ingénieur full stack
    Inscrit en
    Octobre 2006
    Messages
    1 232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : ingénieur full stack

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 232
    Points : 2 061
    Points
    2 061
    Par défaut
    Bonjour,

    As tu vraiment besoin de créer ton classe loader ?
    Si tu dois simplement charger une classe qui n'est pas dans le path, l'utilisation de la classe 'URLClassLoader' peut suffir

    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
        File file = new File("c:\\mesClasses\\");
     
        try {
            URL url = file.toURL();
            URL[] urls = new URL[]{url};
     
            ClassLoader cl = new URLClassLoader(urls);
     
            Class cls = cl.loadClass("com.zz.maClasse");
        } catch (MalformedURLException e) {
        } catch (ClassNotFoundException e) {
        }
    Il n'y a pas de problème, il n'y a que des solutions.
    Cependant, comme le disaient les shadoks, s'il n'y a pas de solution, c'est qu'il n'y a pas de problème.
    Si toutefois le problème persiste, la seule solution restante est de changer le périphérique qui se trouve entre la chaise et l'écran

    Mes Articles : Mon premier article est sur le language D
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  8. #8
    Inactif  
    Inscrit en
    Avril 2005
    Messages
    750
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 750
    Points : 498
    Points
    498
    Par défaut
    C'est un peu se que je fait actuellement, j'ai une classe qui étent URLClassLoader, et j'utilise bien la méthode loadClass("com.zz.maClasse"); mais ensuite, mais ensuite je voudrais pouvoir utiliser la classe loader avec mon DataSource (Apache commons DBCP) afin d'établir la connexion jdbc.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
            BasicDataSource ds = new BasicDataSource();
            ds.setDriverClassName("com.zz.maClasse");
            ds.setUsername("...");
            ds.setPassword("...");
            ds.setUrl(connectURI);
            Connection conn = ds.getConnection()
    Renvoie ClassNotFoundException.

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    132
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2007
    Messages : 132
    Points : 170
    Points
    170
    Par défaut
    Ca ne peut pas fonctionner car le BasicDataSource n'a pas été chargé par ton classloader.

    Un moyen de corriger le probléme est faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
       URLClassLoader loader = ...;
        Class class= loader.loadClass("org.apache.commons.dbcp.BasicDataSource");
        try{
            BasicDataSource ds = (BasicDataSource )class.newInstance();
           ds.setDriverClassName("com.zz.maClasse");
            ds.setUsername("...");
            ds.setPassword("...");
            ds.setUrl(connectURI);
            Connection conn = ds.getConnection()
        } catch (Throwable ex){
            ex.printStackTrace();
        }
    Ainsi tu loades la classe BasicDataSource grace au class loader que tu as defini et ainsi il pourra trouver ton driver "com.zz.maClasse"

  10. #10
    Inactif  
    Inscrit en
    Avril 2005
    Messages
    750
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 750
    Points : 498
    Points
    498
    Par défaut
    Ca ne peut pas fonctionner car le BasicDataSource n'a pas été chargé par ton classloader.

    Un moyen de corriger le probléme est faire:
    Code :

    URLClassLoader loader = ...;
    Class class= loader.loadClass("org.apache.commons.dbcp.BasicDataSource");
    try{
    BasicDataSource ds = (BasicDataSource )class.newInstance();
    ds.setDriverClassName("com.zz.maClasse");
    ds.setUsername("...");
    ds.setPassword("...");
    ds.setUrl(connectURI);
    Connection conn = ds.getConnection()
    } catch (Throwable ex){
    ex.printStackTrace();
    }

    Ainsi tu loades la classe BasicDataSource grace au class loader que tu as defini et ainsi il pourra trouver ton driver "com.zz.maClasse"
    Cela ne peut pas marché car pour effectuer un cast comme tu le fais il faut que la classe soit dans le classpath et donc elle sera chargé par le system classloader. Même si dans le code je la charge avec mon URLClassLoader, cela ne fonctionne pas.

  11. #11
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    132
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2007
    Messages : 132
    Points : 170
    Points
    170
    Par défaut
    OK autant pour moi.

    Une Solution ne pourrait-elle pas être de ne pas mettre le common DBCP dans ton classpath.

    Ensuite tu additionnes le common DBCP dans ton classloader, tu charges le BasicDataSource et ensuite tu fais tout par reflexion ?

  12. #12
    Inactif  
    Inscrit en
    Avril 2005
    Messages
    750
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 750
    Points : 498
    Points
    498
    Par défaut
    Une Solution ne pourrait-elle pas être de ne pas mettre le common DBCP dans ton classpath.

    Ensuite tu additionnes le common DBCP dans ton classloader, tu charges le BasicDataSource et ensuite tu fais tout par reflexion ?
    Oui pas bête , sa ne m'est pas venue à l'esprit, j'avoue que sa fait quelques semaines que je me suis pas remit sur ce projet, c'est dur de s'y remettre. Je te remercie en tout cas. Si cela ne marche pas, faudra que je trouve une autre solution sans le class loader, dur dur... .
    Je te tiens au courant dès que je teste la reflexion.

Discussions similaires

  1. Chargeur de classes
    Par tounou666 dans le forum Général Java
    Réponses: 0
    Dernier message: 26/03/2010, 16h40
  2. stub et chargeur de classe
    Par couse1 dans le forum Débuter
    Réponses: 2
    Dernier message: 22/05/2008, 15h30
  3. Chargeur de classe J2ME
    Par beepmaster dans le forum Java ME
    Réponses: 1
    Dernier message: 16/02/2008, 18h44
  4. Chargeur de Class personnalisé
    Par philippe13 dans le forum AWT/Swing
    Réponses: 1
    Dernier message: 05/01/2007, 10h35
  5. Réponses: 2
    Dernier message: 02/08/2006, 17h21

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