[Résolu] dynamic classpath et plugins

dynamic classpath et plugins [Résolu] - Java - Programmation

Marsh Posté le 27-02-2007 à 15:36:10    

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
Reply

Marsh Posté le 27-02-2007 à 15:36:10   

Reply

Marsh Posté le 27-02-2007 à 16:33:52    

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
Reply

Marsh Posté le 01-03-2007 à 13:42:30    

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
Reply

Marsh Posté le 02-03-2007 à 16:39:06    

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...

Reply

Marsh Posté le 02-03-2007 à 23:04:02    

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
Reply

Marsh Posté le 30-03-2007 à 17:12:33    

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
Reply

Marsh Posté le 30-04-2007 à 13:36:42    

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.

Reply

Marsh Posté le 01-05-2007 à 03:26:36    

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.
 
@++ !

Reply

Marsh Posté le 03-05-2007 à 21:58:59    

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
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed