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.