chargement de librairies *.jar avec ClassLoader
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:
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:
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:
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.