2010-03-29 15 views
12

मैं पहले से ही बहु-मॉड्यूल मैवेन प्रोजेक्ट के लिए अतिरिक्त मॉड्यूल बना रहा हूं। और इसके लिए मैं चाहता हूं कि सब कुछ अन्य मॉड्यूल (अर्थ निर्भरता) में हो, हेलो दुनिया का परीक्षण करने के लिए, तो मैं कुछ और जटिल चीजें करूंगा। और यह हैलो वर्ल्ड प्रिंट करता है क्योंकि इसे जेबॉस सर्वर पर तैनात किया जाना चाहिए, लेकिन मुझे कंसोल पर कुछ अजीब त्रुटि मिलती है, क्या किसी के पास ऐसा ही अनुभव था? और मैं इसे कैसे ठीक कर सकता हूं? संदेश यह है:अजीब jboss कंसोल त्रुटि

15:48:35,789 ERROR [STDERR] log4j:ERROR A "org.jboss.logging.appender.FileAppender" object is not assignable to a "org.apache.log4j.Appender" variable. 
15:48:35,789 ERROR [STDERR] log4j:ERROR The class "org.apache.log4j.Appender" was loaded by 
15:48:35,790 ERROR [STDERR] log4j:ERROR [[email protected]{vfszip:/C:/jboss-5.1.0.GA/server/default/deploy/new-module-0.0.1-SNAPSHOT.war/}] whereas object of type 
15:48:35,790 ERROR [STDERR] log4j:ERROR "org.jboss.logging.appender.FileAppender" was loaded by [[email protected]]. 
15:48:35,790 ERROR [STDERR] log4j:ERROR Could not instantiate appender named "FILE". 

यहाँ appender एक्सएमएल का हिस्सा है

http://pastebin.com/X7Dgdrki

उत्तर

16

सबसे पहले जाँच FILE नामित appender के विन्यास के लिए अपने <server>/conf/jboss-log4j.xml (और इसे यहाँ पोस्ट अगर आप कर सकते हैं - हो सकता है कि हमें और सुराग दें)।

आगे की जांच से पता चलता है कि org.jboss.logging.appender.FileAppender वास्तव में इंटरफ़ेस org.apache.log4j.Appender लागू करता है। तो यह स्पष्ट रूप से एक क्लासलोडर संघर्ष है। एक ही कक्षा परिभाषा (इस मामले में org.apache.log4j.Appender), जब दो अलग-अलग क्लासलोडर द्वारा लोड किया जाता है, तो JVM के लिए दो अलग-अलग वर्गों के रूप में गिना जाता है।

क्या log4j.jar आपके युद्ध में शामिल है, या आपके सर्वर/lib निर्देशिका में? यदि ऐसा है, तो आप इसे हटाने का प्रयास कर सकते हैं और देख सकते हैं कि यह समस्या हल करता है या नहीं।

अद्यतन: वास्तव में सबसे आसान संभव समाधान बस jboss-log4j.xml में org.apache.log4j.FileAppender को appender का प्रकार बदलने के लिए है।

log4j.jar के संबंध में, मेरा मतलब यह है कि यदि यह आपके युद्ध में मौजूद है, तो यह (और org.apache.log4j.Appender की एक प्रति) युद्ध श्रेणी लोडर द्वारा लोड हो जाती है ([email protected] आपके त्रुटि संदेश में)। और यह क्लासलोडर संघर्ष का कारण बनता है। तो अगर आप अपने युद्ध के साथ log4j.jar तैनात नहीं करते हैं, तो त्रुटि दूर हो सकती है। यह केवल मेवेन से संबंधित है जिसमें निर्भरता आपके पोम में कॉन्फ़िगर की गई है। इस छोटे प्रयोग के लिए, आप आसानी से log4j.jar को अपने युद्ध से हाथ से हटा सकते हैं; अगर इस मुद्दे को हल करती है, जैसे अपने पोम में log4j निर्भरता कॉन्फ़िगर के रूप में "प्रदान की",:

<dependency> 
     <groupId>log4j</groupId> 
     <artifactId>log4j</artifactId> 
     <version>1.2.12</version> 
     <scope>provided</scope> 
    </dependency> 

तो log4j.jar अपने युद्ध में नहीं है, यह अभी भी सर्वर/डिफ़ॉल्ट/lib निर्देशिका में हो सकता है - कृपया इसे जांचें और यदि यह वहां है, तो इसे हटाने का प्रयास करें।

+0

@ पीटर टोरोक आपके उत्तर के लिए धन्यवाद, मैंने अपना प्रश्न अपडेट किया है, मैं मैवेन के साथ प्रोजेक्ट का निर्माण कर रहा हूं इसलिए मुझे जार के साथ कोई समस्या नहीं है .. – ant

+0

@ c0mrade मेरा अपडेट देखें। –

+1

जोड़कर प्रदान किया गया चाल, क्यों समझाया जाए? – ant

3

हम हाल ही में इस समस्या को पार कर चुके हैं। हमने ऊपर दिए गए सुझावों की कोशिश की और वे काम नहीं कर पाए। इसलिए हमने सभी लॉग 4j आयातों को एक सार लॉगिंग इंटरफ़ेस के साथ बदलकर समस्या को संभाला (हमने इसके लिए org.apache.commons.logging चुना) और depdenancies से log4j को हटा दिया। फिर क्या होता है वास्तविक अंतर्निहित लॉगिंग कार्यान्वयन जो भी जेबॉस सेट करता है उसका समर्थन करता है। और अगर हम वापस टॉमकैट (जेबॉस के बिना) वापस जाना चाहते हैं तो हम सिर्फ log4j जार या जो भी लॉगर कार्यान्वयन युद्ध में वापस जोड़ सकते हैं।

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