2012-09-13 33 views
5

से गतिशील रूप से कक्षाएं लोड करना मुझे पता है कि हम कस्टम क्लास लोडर का उपयोग कर गतिशील रूप से कक्षाएं लोड कर सकते हैं। लेकिन यहाँ मेरी समस्या मेरी कक्षा में ही है अन्य वर्गोंजार

पर निर्भर करता है

मेरे काम तो मैं 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

आपने अपना क्लासलोडर कैसे बनाया?

क्या आपने एक और "पैरेंट" क्लासलोडर निर्दिष्ट किया है, जिस पर क्लासलोडिंग को प्रतिनिधि बनाया जा सकता है?

+0

मैं है बनाया वर्ग लोडर ..its वर्ग पथ और रिटर्न लेने ** _ customClassLoader = नया URLClassLoader (urls, PigClassLoader.class.getClassLoader()); ** –

+0

कि मेरे वर्ग लोडर के लिए ठीक काम कर रहा है। Thats y ने क्लास को पिगसेवर क्लास –

+0

के लिए अपवाद नहीं मिला है, क्या आप सुनिश्चित हैं कि कॉमन्स-लॉगिंग और 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...