2012-03-01 13 views
36

मुझे एक जिज्ञासा समस्या है। मेरे पास यह जावा एप्लिकेशन था जिसे पहले टोमकैट में तैनात किया गया था और खुशी से लॉगबैक क्लासिक को एक slf4j कार्यान्वयन के रूप में इस्तेमाल किया गया था। अब जब हम एक jboss 7.1.final सर्वर में एक ही एप्लिकेशन को तैनात करने की कोशिश की तो यह और भी के बारे में java.lang.ClassCastException: org.slf4j.impl.Slf4jLoggerFactory cannot be cast to ch.qos.logback.classic.LoggerContext maoning आवेदन की तैनाती नहीं है इस कोड का उल्लंघन करने वाली रेखा हैलॉगबैक और जेबॉस 7 - एक साथ काम नहीं करते?

final LoggerContext lc = (LoggerContext) LoggerFactory.getILoggerFactory();

वर्ग उसकी है कि वसंत है इंजेक्शन और यह असफल रहा है - इसलिए पूरा आवेदन तैनात नहीं किया जा सकता है। किसी को इसका समाधान मिला है? अग्रिम धन्यवाद

इस साइट और अन्य मंचों को देखने के बाद मुझे एहसास हुआ कि जेबॉस 7 अपने स्वयं के slf4j कार्यान्वयन के साथ बंडल हुआ है और लॉग इनबैक में लॉगगरकॉन्टेक्स्ट के समान ILoggerFactory इंटरफ़ेस को लागू करता है। हमारे आवेदन ने इसका एक उदाहरण प्राप्त करने का प्रयास किया लेकिन ऐप सर्वर ने इसका स्वयं का slf4j कार्यान्वयन लगाया।

मैंने jboss \ modules \ org \ slf4j \ impl \ main में module.xml को संशोधित करने का प्रयास किया और इसे लॉगबैक जार पर इंगित किया।

<resources> 
    <resource-root path="logback-classic-0.9.28.jar"/> 
    <resource-root path="logback-core-0.9.28.jar"/> 
</resources> 

अब जब मैं आवेदन शुरू मैं एक गंभीर त्रुटि

Exception starting filter WicketFilter: java.lang.ClassCastException: ch.qos.logback.classic.LoggerContext cannot be cast to ch.qos.logback.classic.LoggerContext

मैं कर रहा हूँ हो रही है मेरी दिमागी अंत में। कोई भी jboss और लॉगबैक विशेषज्ञ मदद कर सकते हैं? अग्रिम धन्यवाद

+1

आप हो रही है 'logback * दोनों'/lib' निर्देशिका में और कान/युद्ध में .jar'? –

+1

हाय टॉमसज़। मेरे पास मेरी युद्ध फ़ाइल की मेरी वेब-आईएनएफ/lib निर्देशिका में लॉगबैक जार हैं। उल्लेख किया है इसके बाद के संस्करण मैं अपने jboss org.slf4j.Impl मॉड्यूल में module.xml बदल दिया है जार (क्लासिक और कोर) जो दोनों के module.xml को उसी फ़ोल्डर में हैं logback बात करने के लिए। – Soumya

उत्तर

57

आपको अपनी तैनाती से slf4j के सर्वर संस्करण को बाहर करने की आवश्यकता है। jboss-deployment-structure.xml फ़ाइल बनाएं और इसे अपने WARS META-INF या WEB-INF निर्देशिका में रखें।

फ़ाइल की सामग्री को इस तरह दिखना चाहिए:

<jboss-deployment-structure> 
    <deployment> 
     <!-- Exclusions allow you to prevent the server from automatically adding some dependencies  --> 
     <exclusions> 
      <module name="org.slf4j" /> 
      <module name="org.slf4j.impl" /> 
     </exclusions> 
    </deployment> 
</jboss-deployment-structure> 
+1

एक इलाज काम किया! धन्यवाद। मुझे लगता है कि हम किसी भी मॉड्यूल को बाहर कर सकते हैं जिसे हम इस फ़ाइल का उपयोग नहीं करना चाहते हैं। धन्यवाद फिर से – Soumya

+0

@ जेम्स आर पर्किन्स मुझे भी यह समस्या मिलती है लेकिन यह मेरी जीता कक्षा है। उदाहरण 'com.java.User'। मुझे समस्या मिलती है जब मैंने 'Jboss 7 सर्वर' को पुनरारंभ किए बिना युद्ध फ़ाइल को दोबारा तैनात किया। इसे कैसे हल कर सकते हैं? – CycDemo

+0

@CycDemo इसे काम करना चाहिए। यदि क्लासकास्ट अपवाद प्राप्त हो रहा है तो कुछ नहीं निकल सकता है। जेबॉस एएस 7 का क्या संस्करण? –

6

आप जुलाई या ऐप्लिकेशन में JCL के लिए पुलों का उपयोग कर रहे हैं, तो आप उन्हें भी शामिल होने चाहिए:

 <module name="org.slf4j" /> 
     <module name="org.slf4j.jcl-over-slf4j" /> 
     <module name="org.slf4j.impl" /> 
     <module name="org.jboss.logging.jul-to-slf4j-stub" /> 
2

वहाँ वैकल्पिक दृष्टिकोण है:

  • आप अपने युद्ध में विन्यस्त लॉगिंग गया
  • आप अपने युद्ध
  • में सभी निर्भरता मिला आप JBoss सर्वर निर्देशिका में कुछ भी कॉन्फ़िगर नहीं करते हैं, नहीं भी अतिरिक्त JBoss मॉड्यूल

बस JBoss पूरी तरह से प्रवेश करने और अपने युद्ध में निर्भरता पर भरोसा करते हैं अक्षम करें। इस प्रकार अपने jboss-deployment-structure.xml संपादित करें:

<?xml version="1.0" encoding="UTF-8"?> 
<jboss-deployment-structure xmlns="urn:jboss:deployment-structure:1.0"> 
    <deployment> 
     <exclusions> 
      <module name="org.apache.commons.logging" /> 
      <module name="org.apache.log4j" /> 
      <module name="org.jboss.logging" /> 
      <module name="org.jboss.logging.jul-to-slf4j-stub" /> 
      <module name="org.jboss.logmanager" /> 
      <module name="org.jboss.logmanager.log4j" /> 
      <module name="org.slf4j" /> 
      <module name="org.slf4j.impl" /> 
      <module name="org.slf4j.jcl-over-slf4j" /> 
     </exclusions> 
    </deployment> 
</jboss-deployment-structure> 

आपके द्वारा अपने ऐप को तैनात, बूटस्ट्रैप लॉगिंग (boot.log) काम कर रखता भी server.log तैनाती प्रवेश दिखाएगा। लेकिन आपके सभी एप्लिकेशन आपके (आपके उदाहरण में) slf4j + आपके युद्ध में लॉगबैक के माध्यम से लॉग इन हैं।

ध्यान दें कि यदि आप इसे निर्दिष्ट करते हैं तो आपको -Dorg.jboss.logging.provider=slf4j के साथ जेबॉस चलाने की आवश्यकता नहीं है, आपको जेबॉस मॉड्यूल (आमतौर पर slf4j-api, logback-classic और logback-core) प्रदान करने की आवश्यकता होगी, लेकिन यह प्रयास के लायक नहीं है , क्योंकि जेबॉस लॉगिंग अब बूटस्ट्रैप (boot.log) और तैनाती की जानकारी (server.log) के लिए उपयोग किया जाता है।

संदर्भ:
http://tinyapps.blogspot.com/2013/01/getting-logback-and-slf4j-to-work-in.html
https://stackoverflow.com/a/19695680/2587343

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