मैं जावा के लिए नौसिखिया हूं और बस कक्षा लोडर की अवधारणा को समझना शुरू कर रहा हूं। अभी मुझे थ्रेड संदर्भ क्लासलोडर के उपयोग के संबंध में log4j के साथ कुछ समस्याएं हैं।log4j और थ्रेड संदर्भ क्लासलोडर
मैं निम्नलिखित त्रुटियाँ हो रही है: A "org.apache.log4j.ConsoleAppender" object is not assignable to a "org.apache.log4j.Appender" variable. The class "org.apache.log4j.Appender" was loaded by [[email protected]] whereas object of type "org.apache.log4j.ConsoleAppender" was loaded by [[email protected]]. Could not instantiate appender named "CONSOLE".
मेरा आवेदन मोटे तौर पर इस तरह से काम करता है: पर # 1 init URLClassLoader निर्माण किया है और लोड हो जाता है कुछ कक्षाएं, इन कक्षाओं log4j का उपयोग करें। बाद में URLClassLoader # 2 पर बनाया गया है (जिसमें URLClassLoader # 1 इसके माता-पिता के रूप में है) और कुछ और कक्षाएं लोड करती हैं, ये कक्षाएं log4j का भी उपयोग करती हैं। जब URL क्लासलोडर # 2 इन वर्गों को लोड करने के लिए उपयोग किया जाता है तो उपरोक्त त्रुटि संदेश प्रकट होता है (एक ही समस्या के साथ कुछ और हैं)।
वर्तमान वैकल्पिक हल मैंने किया समस्याग्रस्त वर्गों लोड हो रहा है, और बाद में वर्ष एक के लिए रीसेट करने से पहले URLClassLoader # 2 के लिए वर्तमान धागा संदर्भ classloader स्थापित करने के लिए किया गया था:
ClassLoader urlClassLoader; // this is URLClassLoader #2
Thread thread = Thread.currentThread();
ClassLoader loader = thread.getContextClassLoader();
thread.setContextClassLoader(urlClassLoader);
try {
urlClassLoader.loadClass(...)
} finally {
thread.setContextClassLoader(loader);
}
हालांकि यह काम करता है, मैं नहीं कर रहा हूँ सुनिश्चित करें कि यह सही दृष्टिकोण है।
इस मामले पर किसी भी अंतर्दृष्टि की सराहना की जाएगी। इसके अलावा, log4j मुझे थ्रेड संदर्भ क्लासलोडर के साथ गड़बड़ करने के लिए मजबूर क्यों कर रहा है? थ्रेड के उपयोग के बजाय मुझे क्लास लोडर में क्यों नहीं जाने दें (और जब मैं नहीं करता तो डिफ़ॉल्ट का उपयोग करें)?
आपने मेरे जीवन को अपने प्रश्न से बचाया, मैं इसी तरह की समस्या के साथ 3 दिनों तक फंस गया था! मैंने "thread.setContextClassLoader" सेट नहीं किया है, और इसके साथ यह ठीक है! जावा में नौसिखिया होने के बावजूद यह वास्तव में अच्छा है! –