2012-09-13 19 views
5

Ich weiß, dass wir Klassen dynamisch laden können, indem Sie benutzerdefinierte Klassenladeprogramme verwenden. Aber hier mein Problem ist meine Klasse selbst hängt von anderen Klassen istKlassen dynamisch aus jar laden

ist Meine Aufgabe PigServer Objekt zu erhalten .So ich folgenden Code verwendet haben PigServer Klasse

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

Aber hier PigServer Klasse selbst abhängt, ist zu laden auf so viele andere Klassen. So

wenn ich versuche Instanz PigServer Klasse zu erhalten, dann ist es zeigt folgende Fehler

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

Kann mir jemand sagen, wie dieses Problem zu lösen?

Antwort

0

Wie haben Sie Ihren ClassLoader erstellt?

Haben Sie einen anderen "Eltern" -Classloader angegeben, auf welchen Classloading delegiert werden kann?

+0

Ich habe erstellt Class Loader ..its nehmen Classpath und kehrt ** _ customClassLoader = new URLClassLoader (URLs, PigClassLoader.class.getClassLoader()); ** –

+0

, dass zu meiner Klasse Loader funktioniert gut. Thats y es zeigte nicht Klasse nicht gefundene Ausnahme für PigServer Klasse –

+0

Sind Sie sicher, dass commons-logging und log4j im Klassenpfad sind? – Mirko

1

Es scheint ein Missverständnis zu geben. Wenn Sie die Gläser in einem Ordner benötigt, um alle haben, sagen Sie „lib“, können Sie zum Beispiel einen Klassenlader wie folgt aufgebaut:

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... 
Verwandte Themen