Bonjour,
Je bloque depuis un moment sur un problème.
J'ai implémenté mon propre ClassLoader afin d'utiliser une classe qui n'est pas dans mon projet.
voici le code de mon ClassLoader :
------------------------------------------------------
----------------------------------------
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41 public class MyClassLoader extends URLClassLoader { protected MyClassLoader(URL[] urls) { super(urls); } protected Class loadClass(String name, boolean resolve) throws ClassNotFoundException { System.err.println("[loadClass("+name+","+resolve+")]"); return super.loadClass(name,resolve); } protected Class findClass(String name) throws ClassNotFoundException { byte[] b = loadClassData(name); return defineClass(null, b, 0, b.length); } private byte[] loadClassData(String name) throws ClassNotFoundException { try { String myclassloader = "monRep/maclasse/"; String filename = myclassloader + name + ".class"; InputStream in = new FileInputStream(filename); byte[] data = new byte[in.available()]; in.read(data); in.close(); return data; } catch (FileNotFoundException x) { throw new ClassNotFoundException(name,x); } catch (IOException x) { throw new ClassNotFoundException(name,x); } } }
J'arrive à récupérer une instance de la classe qui m'intéresse.
Mon problème est que cette classe s'appuie sur des librairies (poi.jar ...) qui sont contenues dans monRep/lib.
J'ai pourtant chargé l'ensemble de ces librairies comme suit:
--------------------------------------
--------------------------------------
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 String file = "monRep/lib/"; File addonsDir = new File(file); File[] jars = addonsDir.listFiles(new FilenameFilter() { <div style="margin-left:40px">public boolean accept(File dir, String name) { return name.endsWith(".jar"); }</div>}); List urls = new LinkedList(); for (int i = 0; i < jars.length; i++) {[/INDENT]try { URL url = jars[i].toURL(); urls.add(url); } catch (MalformedURLException e) {} } MyClassLoader loader = new MyClassLoader(((URL[])urls.toArray(new URL[urls.size()]))); Class classe = loader.loadClass("MaClasse"); Method method = classe.getMethod("myMethod", null);
Lorsque j'appelle une méthode de cette classe en utilisant method.invoke(), voici l'erreur qui se produit:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/poi/ss/usermodel/Workbook at java.lang.Class.getDeclaredMethods0(Native Method) at java.lang.Class.privateGetDeclaredMethods(Class.java:2427) at java.lang.Class.getMethod0(Class.java:2670) at java.lang.Class.getMethod(Class.java:1603) at xls.AccessXls.main(AccessXls.java:59) Caused by: java.lang.ClassNotFoundException: org.apache.poi.ss.usermodel.Workbook
En clair, il n'arrive pas à trouver les différentes classes contenues dans les librairies *.jar et utilisées par ma classe "MaClasse".
Comment charger chacune des librairies dans le classpath?
Merci Pour votre aide.





Répondre avec citation
Partager