2011-06-06 12 views
16

बिलाव Class Loader HOW-TO प्रलेखन 4 अलग वर्ग लोडर वर्णन करता है:आदेश: आम, साझा, और सर्वर

  1. बूटस्ट्रैप
  2. सिस्टम
  3. का webapp
  4. आम

में डिफ़ॉल्ट catalina.properties फ़ाइल, हालांकि, एक साझा और सर्वर वर्ग लोडर के लिए परिभाषित गुण भी हैं। फ़ाइल का डिफ़ॉल्ट संस्करण में इन गुणों के दोनों खाली हैं और टिप्पणियों का कहना है:

तो खाली के रूप में छोड़ दिया है, "आम" लोडर कैटालिना के "साझा"/"सर्वर" लोडर के रूप में इस्तेमाल किया जाएगा।

मुझे इन कक्षा लोडरों के बारे में कोई अतिरिक्त दस्तावेज नहीं मिला है। मेरा सवाल यह है कि साझा लोडर के सापेक्ष साझा और सिस्टम लोडर किस क्रम में खोजे जाते हैं? और इसके अतिरिक्त, इन वर्ग लोडरों के लिए इच्छित उपयोग क्या है?

+0

यह भी देखें http://stackoverflow.com/questions/5474765/order-of-loading-jar-files-from-lib-directory – rogerdpack

उत्तर

9

मैं हाल ही में इस मुद्दे में पड़ गए और यहाँ मैं, क्या मिला

पहले (यह बिलाव 7 ट्रंक से सब है), If left as blank, the "common" loader will be used as Catalina's "shared"/"server" loader.

यहाँ प्रासंगिक source है,

89  private void initClassLoaders() { 
90   try { 
91    commonLoader = createClassLoader("common", null); 
92    if(commonLoader == null) { 
93     // no config file, default to this loader - we might be in a 'single' env. 
94     commonLoader=this.getClass().getClassLoader(); 
95    } 
96    catalinaLoader = createClassLoader("server", commonLoader); 
97    sharedLoader = createClassLoader("shared", commonLoader); 
98   } catch (Throwable t) { 
99    handleThrowable(t); 
100    log.error("Class loader creation threw exception", t); 
101    System.exit(1); 
102   } 
103  } 

106  private ClassLoader createClassLoader(String name, ClassLoader parent) 
107   throws Exception { 
108 
109   String value = CatalinaProperties.getProperty(name + ".loader"); 
110   if ((value == null) || (value.equals(""))) 
111    return parent; 

इसलिए यदि कुछ भी परिभाषित नहीं किया गया है, तो वे common.loader प्रविष्टियों का उपयोग करने के लिए फ़ॉलबैक करते हैं।


आदेश है कि वे में लोड किए गए हैं करने के लिए के रूप में, यहाँ , source

229   Thread.currentThread().setContextClassLoader(catalinaLoader); 
230 
231   SecurityClassLoad.securityClassLoad(catalinaLoader); 
232 
233   // Load our startup class and call its process() method 
234   if (log.isDebugEnabled()) 
235    log.debug("Loading startup class"); 
236   Class<?> startupClass = 
237    catalinaLoader.loadClass 
238    ("org.apache.catalina.startup.Catalina"); 
239   Object startupInstance = startupClass.newInstance(); 
240 
241   // Set the shared extensions class loader 
242   if (log.isDebugEnabled()) 
243    log.debug("Setting startup class properties"); 
244   String methodName = "setParentClassLoader"; 
245   Class<?> paramTypes[] = new Class[1]; 
246   paramTypes[0] = Class.forName("java.lang.ClassLoader"); 
247   Object paramValues[] = new Object[1]; 
248   paramValues[0] = sharedLoader; 
249   Method method = 
250    startupInstance.getClass().getMethod(methodName, paramTypes); 
251   method.invoke(startupInstance, paramValues); 

लाइन 229 सेट common.loader classloader से उन में लोड करने के लिए स्रोत है, तो लाइन 251 सेट shared.loader क्लासलोडर को कैटलिनास पैरेंट क्लास लोडर के रूप में सेट किया गया है।

1

अजीब, Tomcat 5.5 classloader doc अभी भी shared लोडर दस्तावेज है लेकिन 6.0 doesn't; न तो v7.0 है जिसे आप उद्धृत करते हैं। शायद वे इसे खत्म करने जा रहे हैं?

हम अपने सॉफ़्टवेयर के वेनिला संस्करण के साथ आने वाले मौजूदा वर्गों को ओवरराइड करने के लिए साझा लोडर बड़े पैमाने पर का उपयोग करते हैं। हमारे द्वारा निर्मित सॉफ़्टवेयर रिलीज़ में आता है और एक ग्राहक के लिए एक पूर्ण नई रिलीज करने के लिए आता है (जो कहता है, एक महत्वपूर्ण बगफिक्स की आवश्यकता है) बहुत महंगा है (सबकुछ पुनः परीक्षण, पुनर्निर्माण, नया दस्तावेज, नया संस्करण संख्या इत्यादि प्रदान करना)। तो हम इसके बजाय क्या करते हैं हम एक "हॉटफिक्स" प्रदान करते हैं जो साझा लोडर में जाता है और वेबपैप में प्रासंगिक .class ओवरराइड करता है।

अक्सर, "हॉटफिक्स" केवल एक वर्ग है इसलिए समग्र प्रतिगमन जोखिम न्यूनतम होता है।

जब हमारे सॉफ़्टवेयर को अपग्रेड किया जाता है, तो अपग्रेड "हॉटफिक्स" को हटा देता है क्योंकि सही कोड हमारे सॉफ़्टवेयर के अगले संस्करण में भी मौजूद होगा।

मैं कई अलग-अलग वेबपैडों में फैले कुछ के लिए साझा क्लासलोडर का उपयोग करके अन्य लोगों की कल्पना भी कर सकता हूं।

+1

तो, @ मिंडास, आप कह रहे हैं कि साझा क्लास लोडर वास्तव में पहले खोजा गया है वेबपैप वर्ग लोडर? यह सही प्रतीत नहीं होता है। –

1

दिमाग के साथ सहमत हैं, अपाचे टॉमकैट समूह बहिष्कृत सर्वर & साझा क्लासलोडर पर विचार कर सकता है। Webappclassloader और standardclassloader (सामान्य वर्ग लोडर) के आदेश के बारे में, जियानबो द्वारा किया गया एक दिलचस्प पोस्ट है। उन्होंने इसे प्रदर्शित करने के लिए एक सरल परीक्षण किया। http://web.archive.org/web/20120303091507/http://www.jianbozhu.net/2012/02/14/tomcat-classloader-demonstration/

मूल रूप से इसका अर्थ यह है कि टॉमकैट में, क्लासलोडर पहले वेबैप से कक्षाएं लोड करता है, फिर साझा/सामान्य, फिर सिस्टम।

संबंधित मुद्दे