Bonjour,
Après maintes recherches sur le forum et sur internet, je me permets d'exposer mon problème ici:
Je développe un plugin eclipse qui a besoin d'un paquets de .jar externes (l'api pellet).
Je voudrais importer les classes de ces .jar au moment de l'exécution.
Cela fonctionne en spécifiant statiquement le chemin (interne au projet) des .jar dans la directive Bundle-ClassPath du MANIFEST.MF (via le plugin editor).
Mais je voudrais importer les classes dynamiquement pour que l'utilisateur puisse spécifier dans les préférences le chemin de l'api pellet.
J'utilise pour cela un UrlClassLoader qui importe bien mes classes (je vois ça en mettant -verbose:class en argument de la VM).
Cependant rien n'y fait : j'ai une NoClassDefFoundError dès que je veux utiliser une classe importée dynamiquement.
Voilà comment je procède :
Je charge le .jar dans un URLClassLoader et je charge les classes qu'il me faut
1 2 3 4 5
| URL url = new URL("jar:file:///chemin/vers/mon.jar!/");
URL [] uarray = {url};
URLClassLoader ucl = new URLClassLoader(uarray);
ucl.loadClass("nom.complet.de.MaClass");
/*et plein d'autres classes*/ |
Ensuite je crée un objet (un thread) qui va avoir besoin de ces classes
1 2
| MonThread mt = new MonThread();
mt.start() //car c'est un thread |
Ensuite j'appelle ma classe importée depuis cet objet
MaClasse mc = new MaClasse()
Sachant que j'ai une directive import de MaClass pour que ça compile.
J'ai l'erreur NoClassDefFoundError à la création de MonThread, c'est à dire avant même que l'objet MonThread n'essaye d'instancier la classe importée dynamiquement.
J'ai essayé de créer le ClassLoader dans le constructeur de MonThread, même problème.
Est-ce que j'ai même le droit d'instancier la classe importée sans utiliser newInstance() ?
Si quelqu'un pouvait me donner des indications, merci.
Partager