2012-09-13 6 views
5

So che è possibile caricare le classi in modo dinamico utilizzando caricatori di classi personalizzati. Ma qui il mio problema è la mia classe è di per sé dipende da altre classiCaricamento dinamico delle classi dal barattolo

Il mio compito è quello di ottenere l'oggetto PigServer .Così ho usato seguente codice per caricare classe PigServer

_pigServerClass = _classLoader.loadClass("org.apache.pig.PigServer"); 

Ma qui classe PigServer è di per sé dipende su così tante altre classi.

Così, quando sto cercando di ottenere un'istanza della classe PigServer allora sta mostrando seguenti errori

java.lang.ClassNotFoundException: org.apache.commons.logging.LogFactory 
java.lang.ClassNotFoundException:org.apache.log4j.AppenderSkeleton 
etc.. 

Qualcuno può dire a come risolvere questo?

risposta

0

Come hai creato il tuo ClassLoader?

Hai specificato un altro classloader "genitore", su quale può essere delegato il caricamento di classi?

+0

ho creato ..its class loader prendere percorso di classe e ritorna ** _ customClassLoader = new URLClassLoader (urls, PigClassLoader.class.getClassLoader()); ** –

+0

che al mio caricatore di classe funziona correttamente. Questo non ha mostrato un'eccezione di classe non trovata per PigServer Class –

+0

Sei sicuro, che commons-logging e log4j sono nel classpath? – Mirko

1

Sembra esserci un malinteso. Se si dispone di tutti i vasi necessari in una cartella, dire "lib", è possibile ad esempio impostare un caricatore di classe come questa:

File libs = new File("lib"); 
    File[] jars = libs.listFiles(new FileFilter() { 
     public boolean accept(File pathname) { 
      return pathname.getName().toLowerCase().endsWith(".jar"); 
     } 
    }); 

    URL[] urls = new URL[jars.length]; 
    for (int i=0; i<jars.length; i++) { 
     urls[i] = jars[i].toURI().toURL(); 
    } 
    ClassLoader uc = new URLClassLoader(urls,this.getClass().getClassLoader()); 


    Class<?> pigServerClz = Class.forName("org.apache.pig.PigServer", false, uc); 
    Object pigServer = pigServerClz.newInstance(); 
    // etc...