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 :

[Stratégie][Classloader] presque un plugins


Sujet :

Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2005
    Messages
    87
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2005
    Messages : 87
    Par défaut [Stratégie][Classloader] presque un plugins
    Bonjour,

    j'explique mon problème :
    dans mon application j'aimerais charger dynamiquement des class bien précise :
    j'analyse le dossier qui les contiendrais (un peu comme s'il s'agissait de plugins) et suivant le nom du fichier je les garde en mémoire ( le nom du fichier) ensuite l'utilisateur de l'application peux choisir de prendre l'une ou l'autre des class.
    De là le programme chargerais la class et pourrait l'utiliser.

    mon problème est que les class en question doivent :
    • pouvoir utiliser des class de mon jar principal ( donc si jamais je les mettait en jar cela ne serait pas du tout exécutable... )
    • doivent pour voir être ajouter dans le dossier spécifique, réservé à leur usage) de façon copier coller ou autre


    en gros se serait un peux comme des plugins sauf que, je pense, un plugins est indépendant du programme(il n'utilise pas les class du programme non? )

    d'où ma question est-ce réalisable, sans recompiler tout le jar exécutable?

    ps : je sais pas si je suis clair...

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    352
    Détails du profil
    Informations personnelles :
    Âge : 58
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2006
    Messages : 352
    Par défaut
    Je ne suis pas certain d'avoir compris, mais je vais essayer d'y répondre car cela ressemble à un problème que nous avons résolu dans nos softs : comment remplacer dynamiquement (sans recompilation, voire entre 2 appels) une partie de code.

    Pour t'attaquer à ce problème il est impératif d'être familiarisé avec les classloader et comment Java gère les classe et les classpath.

    Pour cela il faut charger dynamiquement ta classe, et pour cela utiliser le URLClassLoader.

    Dans ton cas, il faut récupérer la liste des fichiers jar de ton répertoire (mais je pense que ce n'est pas cela qui te pose problème).

    Une fois que tu as décidé quel jar utiliser, pour utiliser les classes qu'il contient, il faut instancier un URLClassLoader auquel tu aura passé une référence sur ton fichier Jar.

    lors de l'instanciation de l'URLClassloader, il faut impérativement lui passer aussi en paramètre le classloader de la classe appelante.

    Pour pouvoir utiliser une classe ainsi chargée, il faut que la classe appelante puisse invoquer les méthodes du plugin, et c'est là toute la difficulté (la solution paraît évidente une fois qu'on l'a trouvée) : la classe du plugin doit impérativement implémenter une interface, et cette interface doit impérativement se trouver dans le classpath de la classe appelante et surtout pas dans le jar du plugin (c'est à cause d'elle qu'il faut passer le classloader de la classe courante à l'URLCLassloader).

    Ensuite pour instancier la classe du plugin, il faut faire un urlclassloader.forname( "package.nomdeclasse" ) pour récupérer une référence sur Class, puis instancier cette classe
    pour plus de facilité, définir une classe de plugin prenant un constructeur vide, car dans ce cas tu peux utiliser la méthode newinstance().

    Une fois que tu a récupéré ton instance, tu la "cast" avec ton interface, et tu peux alors l'utiliser.

    J'espère que cela correspond à ce que tu veux faire, et si je ne suis pas clair je m'en excuse, mais le problème n'est pas trivial; même si le code au final tient en quelques lignes.
    Par contre, attention aux performances : l'instanciation de l'URLClassloader + instanciation des classes du plugin est un processus assez long : il est impératif (dans la mesure du possible) de mettre en place des systèmes de cache. Si ton plugin, une fois chargé ne change plus, il faut conserver une référence au pire sur le classloader, au mieux sur la classe (Class castée en ton interface).

    En espérant que cela t'aidera

    Jacques Desmazières

  3. #3
    Membre actif
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2005
    Messages
    87
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2005
    Messages : 87
    Par défaut
    Citation Envoyé par Jacques - 06
    comment remplacer dynamiquement (sans recompilation, voire entre 2 appels) une partie de code.
    c'est exactement cela ....

    merci, je vais essayer de lire et comprendre tout ce que tu à dit ( mais cela ne sera pas pour tout de suite car étant étudiant j'ai des examen en ce moment )


    sinon en gros c'est les class que l'on ajoute seront ajouté une fois, elle pourront à la limite être enlevée mais sans plus.

    ce qui me posait problème c'est surtout le fait que ces class utilise des méthode et des objet de l'application dont elle seront en quelques sorte le plugins. mai apparemment cela ne pose pas de problème.
    de toute manière je finirait bien par trouver.

  4. #4
    Membre chevronné
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    352
    Détails du profil
    Informations personnelles :
    Âge : 58
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2006
    Messages : 352
    Par défaut
    ce qui me posait problème c'est surtout le fait que ces class utilise des méthode et des objet de l'application dont elle seront en quelques sorte le plugins. mai apparemment cela ne pose pas de problème.
    C'est toute l'utilité du classloader passé en paramètre du constructeur de l'URLClassloader : comme la politique de recherche en java est d'interroger en premier lieu les parents pour retrouver une classe, ton plugin "verra" les classes de l'application. Par contre, l'application ne "verra" pas les classes du plugin que sous forme de leur interface, mais ça n'est pas un problème.

    Bon courage pour les exams, et si tu ne t'en sors pas de ton plugin je pourrais essayer de rentrer un peu plus en détail.

    Jacques Desmazières

  5. #5
    Membre actif
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2005
    Messages
    87
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2005
    Messages : 87
    Par défaut
    ah avec ta dernière précision, je pense que je suis totalement rassurer.

    je pense que cela devrait aller...

    faut dire que je me suis lancer dans mon projet alors que je n'ai que les base ( enfin à peine) de java donc je vais un peu à l'aveuglette, mais bon cela me permet d'apprendre. Je testerait plus tard


    merci pour tout, si il y a un problème je reposterait ici.

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

Discussions similaires

  1. Problème de ClassLoader dans l'utilisation d'un plugin Eclipse
    Par hanial dans le forum Eclipse Platform
    Réponses: 0
    Dernier message: 08/07/2011, 10h47
  2. Problème de classLoader dans l'utilisation d'un plugin Eclipse
    Par Cluster37 dans le forum Eclipse Platform
    Réponses: 11
    Dernier message: 12/05/2008, 17h40
  3. Plugin MySQL
    Par Super Castor dans le forum Eclipse Java
    Réponses: 6
    Dernier message: 30/08/2006, 02h54
  4. [plugin] XML/XSL
    Par cyrdec dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 29/04/2003, 17h50
  5. plugin winamp
    Par darkfrag dans le forum API, COM et SDKs
    Réponses: 7
    Dernier message: 03/08/2002, 10h34

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