2012-09-13 43 views
5

我知道我們可以通過使用自定義類加載器來動態加載類。 但在這裏我的問題是我的類本身是依靠其他類從jar中動態加載類

我的任務是讓PigServer對象。所以我用下面的代碼

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

但這裏PigServer類本身就是取決於加載PigServer類在許多其他類上。

所以,當我試圖讓那麼PigServer類的實例它顯示下列錯誤

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

誰能告訴如何解決這個問題?

回答

0

您是如何創建ClassLoader的?

您是否指定了另一個「父」classloader,可以委派哪些類加載?

+0

我創建的類加載器..its採取類路徑和回報** _ customClassLoader =新URLClassLoader(網址,PigClassLoader.class.getClassLoader()); ** –

+0

這對我的類加載器工作正常。多數民衆贊成它沒有顯示類沒有發現異常PigServer類 –

+0

你確定,commons-logging和log4j在類路徑中嗎? – Mirko

1

似乎有一個誤解。如果你把所有的文件夾中所需的罐子,說:「LIB」,比如,你可以建立一個類加載器是這樣的:

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