Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1602 connectés 

  FORUM HardWare.fr
  Programmation
  Java

  [Résolu] dynamic classpath et plugins

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[Résolu] dynamic classpath et plugins

n°1521031
wapcamer
Posté le 27-02-2007 à 15:36:10  profilanswer
 

Bonjour,
 
Je cherche dans mon programme à rajouter des plugins sans avoir à modifier le programme (un peu comme dans eclipse).
J'ai utilisé la même méthode que dans ce post http://forum.hardware.fr/hfr/Progr [...] tm#t768648 afin de charger dynamiquement mes classes. Dynamiquement, parce que les librairies ne font pas partie du classpath au démarrage de l'appli.
 
Hors ça marche bien!!
 
Le problème, c'est que lorsque je veux enregistrer mes plugins avec la classe JMF

Code :
  1. PlugInManager.addPlugIn()

, cela échoue systématiquement. Alors que si je démarre l'appli avec les jar présents dans le classpath, l'enregistrement se passe correctement.
 
Je me demande si le je ne devrais pas utiliser le SystemClassLoader plutot qu'un URLClassLoader créé à la volée, pq dans ce cas, les classes chargées ne "seraient" pas accessibles par toutes les classes ... mais ca me semble un peu tordu et je ne vois d'ailleurs pas trop cmt faire.
 
Merci de votre aide.

Message cité 1 fois
Message édité par wapcamer le 03-05-2007 à 22:01:22

---------------
Voir les RAW sous Android: https://market.android.com/details? [...] .RawVision Blog Photo: http://photouch.me Applications mobiles: http://caketuzz.com Wapcam Project: http://wapcam.mobi
mood
Publicité
Posté le 27-02-2007 à 15:36:10  profilanswer
 

n°1521084
wapcamer
Posté le 27-02-2007 à 16:33:52  profilanswer
 

Bon,
pour avancer un peu, etdisposant du code source de JMF,
 
javax.media.PlugInManager.addPlugIn()
 
fait appel à javax.media.pim.PlugInManager.addPlugIn()
 
qui retourne false sous les conditions suivantes:

Code :
  1. if (li != null) {
  2.     v = li.classNames;
  3.     Enumeration eClassNames = v.elements();
  4.     while (eClassNames.hasMoreElements()) {
  5.  cni = (ClassNameInfo) eClassNames.nextElement();
  6.  // Return false if the class already exists in this list
  7.  if (cni.className.equals(className))
  8.      return false;
  9.     }
  10. } else {
  11.     // This is the first item in this list.
  12.     v = new Vector(5);
  13. }
  14. // TODO : remove this
  15. // Additional verification to make sure such a class exists
  16. try {
  17.     Class piClass = getClassForName(className);
  18. } catch (Throwable t) {
  19.     // Sorry dude. You cant fool me with random class names
  20.     return false;
  21. }


 
Le cas où le plugin existe deja dans la base est exclu, je peux le vérifier.
Reste le cas avec l'appel à getClassForName:
 

Code :
  1. // This is a Package private class
  2.     static Class getClassForName(String className)
  3.                 throws ClassNotFoundException {
  4. /**
  5.  *  Note: if we don't want this functionality
  6.  *  just replace it with Class.forName(className)
  7.  */
  8. try {
  9.     return Class.forName(className);
  10. } catch (Exception e) {
  11.     if (!checkIfJDK12()) {
  12.  throw new ClassNotFoundException(e.getMessage());
  13.     }
  14. } catch (Error e) {
  15.     if (!checkIfJDK12()) {
  16.  throw e;
  17.     }
  18. }
  19. /**
  20.  *  In jdk1.2 application, when you have jmf.jar in the ext directory and
  21.  *  you want to access a class that is not in jmf.jar but is in the CLASSPATH,
  22.  *  you have to load it using the the system class loader.
  23.  */
  24. try {
  25.     return (Class) forName3ArgsM.invoke(Class.class, new Object[] {
  26.  className, new Boolean(true), systemClassLoader});
  27. } catch (Throwable e) {
  28. }
  29. /**
  30.  *  In jdk1.2 applet, when you have jmf.jar in the ext directory and
  31.  *  you want to access a class that is not in jmf.jar but applet codebase,
  32.  *  you have to load it using the the context class loader.
  33.  */
  34. try {
  35.     // TODO: may need to invoke RuntimePermission("getClassLoader" ) privilege
  36.     ClassLoader contextClassLoader =
  37.  (ClassLoader) getContextClassLoaderM.invoke(Thread.currentThread(), null);
  38.     return (Class) forName3ArgsM.invoke(Class.class, new Object[] {
  39.  className, new Boolean(true), contextClassLoader});
  40. } catch (Exception e) {
  41.     throw new ClassNotFoundException(e.getMessage());
  42. } catch (Error e) {
  43.     throw e;
  44. }
  45.     }


 
Il y a bien une histoire de "context" classloader mais slt pr le jdk1.2.
 
Voilà si qqn a des idées ....


---------------
Voir les RAW sous Android: https://market.android.com/details? [...] .RawVision Blog Photo: http://photouch.me Applications mobiles: http://caketuzz.com Wapcam Project: http://wapcam.mobi
n°1522213
wapcamer
Posté le 01-03-2007 à 13:42:30  profilanswer
 

Bon je crois que j'aurais du commencer mon sujet par
j'ai une java.lang.ClassNotFoundException.......
qui peut m'aider???
 
 


---------------
Voir les RAW sous Android: https://market.android.com/details? [...] .RawVision Blog Photo: http://photouch.me Applications mobiles: http://caketuzz.com Wapcam Project: http://wapcam.mobi
n°1522964
djok_fb
C'était mieux avant!
Posté le 02-03-2007 à 16:39:06  profilanswer
 

Ici, au boulot, on utilise:
JPF
Tu trouves le projet ici:
http://jpf.sourceforge.net/
 
Ca marche plutot bien et c'est pas excessivement dur a utiliser.
 
Je n'ai jamais utilisé JMF donc je peux pas t'aider sur ce point la...

n°1523150
wapcamer
Posté le 02-03-2007 à 23:04:02  profilanswer
 

Merci pour le lien.
C'est un projet interessant.
 
Le truc, c'est qu'en fait, j'arrive déjà à charger dynamiquement des classes; j'ai déjà implémenté tout un mécanisme, et je sais qu'au sein de mon appli, les classes sont chargées. Mais la lib externe qu'est JMF refuse d'enregistrer ces nouvelles classes, alors que si elles sont dans le claspath au démarrage, ça fonctionne...
C'est vraiment bizzarre.
 
Je vais essayer de regarder un peu le code  de JPF, pt-e utilisent-ils des des techniques sioux que je ne connais pas.
 
Autrement, je vais aussi essayer de charger mes plugins par le biais de JPF, pt-e que ca fonctionnera ...
 
 :hello:


---------------
Voir les RAW sous Android: https://market.android.com/details? [...] .RawVision Blog Photo: http://photouch.me Applications mobiles: http://caketuzz.com Wapcam Project: http://wapcam.mobi
n°1536500
wapcamer
Posté le 30-03-2007 à 17:12:33  profilanswer
 

djok_fb>> Avec le JPF framework, est-ce que tu arrives à charger des classes depuis n'importe où dans ton appli, sans faire appel au framework ?
 
Car mon pb, c'est que si je fais:

Code :
  1. Class.forName(codecName, true, loader);

avec loader un URLClassLoader, pas de pb ca fonctionne bien,  
mais

Code :
  1. Class.forName(codecName);

ne fonctionne pas.
 
J'ai bel et bien un problème de délégation entre mes ClassLoader et je n'arrive pas à le résoudre.  :pt1cable:


---------------
Voir les RAW sous Android: https://market.android.com/details? [...] .RawVision Blog Photo: http://photouch.me Applications mobiles: http://caketuzz.com Wapcam Project: http://wapcam.mobi
n°1551432
djok_fb
C'était mieux avant!
Posté le 30-04-2007 à 13:36:42  profilanswer
 

Il suffit de spécifier le path où sont posés les plugins lors de l'implémentation de JPF.
Dans mon cas, c'est une appli web, on lui spécifie le chemin dans l'appli et ca roule.

n°1551715
bugbreeder
Posté le 01-05-2007 à 03:26:36  profilanswer
 

Salut,
 

wapcamer a écrit :

Je cherche dans mon programme à rajouter des plugins sans avoir à modifier le programme (un peu comme dans eclipse).


 
T'es sur d'avoir un tel besoin aussi "lourd", alors qu'un petit Command pattern avec delegation peut suffire ?
Du genre formater un contenu en Texte (TextFormater.class) ou en PDF (PdfFormater.class) ou en HTML (HtmlFormater.class) ou ... :
 
new ContentDisplay(TextFormater.class);
 
__________________
 
class ContentDisplay
{
private ContentFormater contentFormater;
public Class formater;
 
 public ContentDisplay (Class formater)
 {
  try
  {
   contentFormater = (ContentFormater)formater.newInstance();
  }
  catch ( InstantiationException e )
  catch ( IllegalAccessException e )
  .........................
  contentFormater.formatContent();
 
__________________
 
public abstract class ContentFormater
{
 public void formatContent();
 
class TextFormater extends ContentFormater
{
 public void formatContent()
 {
  // implementation du formatage Texte
 }
 
 
Pour moi ca permet de simuler des plugins (TextFormater.class, PdfFormater.class, HtmlFormater.class), il suffit d'appeler la classe souhaitee et de refaire "run", dans mon cas ca suffit amplement.
Evidemment si tu dois gerer le depot a chaud des plugins, la il te faut un truc du genre OSGI ou JPF effectivement.
 
@++ !

n°1555082
wapcamer
Posté le 03-05-2007 à 21:58:59  profilanswer
 

bugbreeder a écrit :


T'es sur d'avoir un tel besoin aussi "lourd"


 
Ben oui je suis sur. C'est le moins lourd et le plus facile à utiliser pr moi.
 
Mais bon, j'ai finalement trouvé mon bonheur, exactement ce que je voulais. J'ai du chercher beaucoup et passer du côté obscure de la force en JAva, des trucs que je soupçonnais même pas. Voilà le lien vers un topic chez sun qui propose des soluce.
 
http://forum.java.sun.com/thread.j [...] 0&tstart=0
 
En tt cas je px maintenant avancer dans mon prog.
 
Merci aux propositions de solutions.
 
 :hello:


---------------
Voir les RAW sous Android: https://market.android.com/details? [...] .RawVision Blog Photo: http://photouch.me Applications mobiles: http://caketuzz.com Wapcam Project: http://wapcam.mobi

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Java

  [Résolu] dynamic classpath et plugins

 

Sujets relatifs
[RESOLU]comment calculer la distance entre 2 villes (code postaux?) ??fork et SIGCHLD (RESOLU)
[RESOLU]Url Rewriting[Architecture de l'ordi] Taille bus d'adresses, (Résolu)
[Résolu] [VBS] Mappage réseaux selon le groupe de l'utilisateur ADLogiciel de programmation en paire - Résolu
[Résolu][VBA ACCESS] LIKE + * ou % ?[resolu]ID qui s'incrémente +2
Impossible de compiler des shaders en cg! [RESOLU][RESOLU] 1 erreur de validation (x)HTML 1.0 Transitional
Plus de sujets relatifs à : [Résolu] dynamic classpath et plugins


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR