Bonjour !
J'ai un problème assez compliqué à expliquer au chargement d'une classe contenue dans un fichier jar, je vais essayer d'être clair quand même...
J'ai un projet qui définit une classe GenericPlugin (Qui contient les méthodes minimales de tous les plugins de ce projet)...
J'ai un second projet (qui contient les classes necessaires à mon plugin de test) qui définit une classe systeme.Main qui hérite de GenericPlugin...
Jusque là tout va bien je crée ensuite un jar de mon plugin en précisant la main-class dans le manifest.
ça se complique dans mon premier projet quand je veux récupérer mon plugin... je cherche les jar d'un répertoire, quand j'en trouve un, je lis le manifest, je récupère la main class et je la charge avec le code :
Quand j'exécute de code, je me retrouve avec la trace suivante dans la console :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 JarFile fichierJar = new JarFile(fichier); Manifest manifest = fichierJar.getManifest(); Attributes attributes = manifest.getMainAttributes(); if(attributes.containsKey(Attributes.Name.MAIN_CLASS)){ String mainClass = attributes.getValue(Attributes.Name.MAIN_CLASS); URL urlList[] = {fichier.toURL()}; ClassLoader loader = new URLClassLoader(urlList); Class classe = Class.forName(mainClass,true,loader); Method[] methodes = classe.getMethods(); for (int j = 0;j<methodes.length;j++){ System.out.println(methodes[j].getName()); } } System.out.println(classe.getSuperclass());
main
hashCode
getClass
wait
wait
wait
equals
notify
notifyAll
toString
class java.lang.Object
bref, ma classe mère GenericPlugin a disparue (Vu que ma superclass est class java.lang.Object), les méthodes de ma classe plugin ont également disparues....
mon fichier manifest est comme ça :
Manifest-Version: 1.0
Created-By: 1.4.2_08 (Sun Microsystems Inc.)
Main-Class: systeme.Main
Et la classe de mon plugin (J'ai décompilé la classe qui était dans le jar qui est lu par l'autre projet)
les methodes afficher() et getMenu() sont les méthodes abstraites de la classe GenericPlugin, les autres sont définies ici
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 package systeme; import java.awt.MenuItem; import java.io.PrintStream; import plugin.GenericPlugin; public class Main extends GenericPlugin { public Main() { } public MenuItem getMenu() { return null; } public void afficher() { System.out.println("Chronoz"); } public void zzz() { System.out.println("Chronoz"); } }
voilà si quelqu'un a une idée de piste, parceque là, je sèche un peu
Merci d'avance
Partager