PDA

View Full Version : [JAVA] Loadig dinamico classi


giuseppe83
27-12-2005, 15:04
Innanzi tutto il mio obiettivo: caricare dinamicamente dei factory, contenuti in una cartella, da utilizzare poi per istanziare i vari componenti di un "plugin".

Il problema č che questi factory oltre alle classi Java standard potrebbero necessitare di altre classi contenuti in altri jar, che perņ non posso aggiungere staticamente al classpath dato che a priori non conosco i plugin che sono presenti e le loro dipendenze.

Avevo allora pensato ad un codice del genere

File f1=new File("C:/IRApplication/lib/jdeal/jdeal.jar");
File f2=new File("C:/IRApplication/extensions/algorithms/DCGA");
URL url1=f1.toURL();
URL url2=f2.toURL();
URLClassLoader cl = new URLClassLoader(new URL[] {url1,url2},ClassLoader.getSystemClassLoader());

Class c = cl.loadClass("it.unisannio.rcost.cise.dcga.factory.IRDCPlugin");
IRAlgorithmPlugin p = (IRAlgorithmPlugin) c.newInstance();
//fin qui tutto bene
//l'invocazione del seuguente metodo della classe caricata
//tramite reflection genera un'eccezione
IRAlgorithm alg=(IRAlgorithm) p.getAlgorithm();


L'eccezione generata č la seguente
Exception in thread "main" java.lang.NoClassDefFoundError: pt/laseeb/jdeal/ChromosomeEvaluator
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(Unknown Source)
at java.security.SecureClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.access$100(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClassInternal(Unknown Source)
at it.unisannio.rcost.cise.dcga.factory.IRDCPlugin.getAlgorithm(IRDCPlugin.java:48)
at prova.main(prova.java:24)

La classe non trovata, ossia pt/laseeb/jdeal/ChromosomeEvaluator, fa parte del jar che ho specificato al classloader(jdeal.jar).
Il metodo che genera l'eccezione semplicemente dovrebbe istanziare una classe che a sua volta fa uso e importa classi contenute nel file jar menzionato

Qualcuno sa spiegarmi il motivo di questa eccezione?? O consigliarmi un altro metodo per implementare un meccanismo di plug-in con caricamento dinamico delle classi e dei jar da cui dipendono?