2011-09-19 13 views
9

ओएसजीआई दस्तावेज के अनुसार, ओएसजीआई को क्लासपाथ समस्याओं को रोकने में मदद के लिए डिज़ाइन किया गया है।ओएसजीआई: क्लासपाथ स्थिरता सुनिश्चित करने के लिए कैसे?

उदाहरण के लिए, "काम करते हुए OSGi" से:

ClassNotFoundExceptions जब आपके आवेदन शुरू करने क्योंकि वर्ग पथ सही नहीं था। ओएसजीआई यह सुनिश्चित करके मदद कर सकता है कि कोड कोड निष्पादित करने की अनुमति देने से पहले निर्भरताएं संतुष्ट हैं।

हालांकि, बाद से हम OSGi के लिए हमारी जावा आवेदन स्विच कर लें, मैं और अधिक ClassNotFoundExceptions और विशेष रूप से पहले से कहीं ज्यादा NoClassDefFoundErrors देखते हैं। कक्षाएं जिन्हें पहले ठीक से लोड किया गया था, अब ओएसजीआई क्लासलोडर द्वारा नहीं पाए जाते हैं, और इससे भी बदतर: आपको रन-टाइम पर त्रुटि मिलती है, जिसका अर्थ यह है कि आप आसानी से इसके आवेदन के हर कोने का परीक्षण करके इसे आसानी से जांच नहीं सकते हैं।

उदाहरण के लिए, हमारा आवेदन ओएसजीआई के तहत खुशी से चल रहा था, लेकिन हमें बीटा टेस्टर्स से रिपोर्ट मिली कि वे अब पीडीएफ में दस्तावेज़ निर्यात नहीं कर सके। वास्तव में, जब मैं इसे में देखा, मैंने पाया इस कार्यक्षमता के कारण होता है कि एक अपवाद लॉग इन करने की:

java.lang.NoClassDefFoundError: org/w3c/dom/Node 

तो, OSGi वास्तव में यह हल करती है और अधिक से अधिक classpath समस्याएं पैदा कर रहा है?

और सबसे महत्वपूर्ण बात यह है कि मैं कैसे जांच सकता हूं कि मेरे क्लास-पथ सभी आवश्यक आयात-पैकेज विवरण आदि के साथ संगत है, से पहले मैंने बग रिपोर्ट में उनके बारे में पढ़ा?

+0

हल "मैन्युअल रूप से अपने आवेदन के हर कोने परीक्षण के अलावा" - ईआरएम स्वचालित परीक्षण? (यह किसी भी आवेदन पर लागू होता है) यदि आपके पास माइग्रेट करने से पहले परीक्षण सूट थे तो आपने टेस्टर्स के सामने इन त्रुटियों को देखा होगा। यह जांचने के लिए कि आपके बंडल सही ढंग से तार करते हैं, आपको कुछ एकीकरण परीक्षण करने की आवश्यकता होगी - हम इसके लिए पैक्स परीक्षा का उपयोग कर रहे हैं और इसमें संक्षिप्त एकीकरण परीक्षण (वर्तमान बंडल और इसके सहयोगी) हैं और साथ ही साथ कुछ अंत तक परीक्षण (पूरे ऐप का परीक्षण)। – earcam

उत्तर

12

एक OSGi आवेदन अगर अपने प्रकट सही है नहीं ClassNotFoundExceptions और NoClassDefFoundErrors फेंक देते हैं। यही है, आपको ओएसजीआई को बताने की ज़रूरत है जो आपके बंडल का उपयोग करता है; यदि आप इसे सही या ईमानदारी से नहीं करते हैं, तो ओएसजीआई आपकी मदद नहीं कर सकता है। दूसरे शब्दों में: जीआईजीओ (कचरा, कचरा आउट)।

उदाहरण के लिए, आप पैकेज org.w3c.dom का उपयोग करते हैं लेकिन आप इसे अपने Import-Package कथन में सूचीबद्ध नहीं करते हैं। इसलिए ओएसजीआई यह नहीं जानता कि आपको उस पैकेज तक पहुंच की आवश्यकता है, और इसलिए जब आप वास्तव में उस पैकेज से कक्षाएं लोड करने का प्रयास करते हैं, तो वे उपलब्ध नहीं हैं।

तो, आपको यह सुनिश्चित करना होगा कि आपके Import-Package कथन आपके बंडलों का वास्तव में उपयोग किए जाने वाले पैकेजों के संबंध में सटीक है। अच्छी खबर यह है कि "बीएनडी" टूल सभी सांख्यिकीय रूप से संदर्भित संकुलों को खोजने के लिए बाइटकोड विश्लेषण का उपयोग करके बंडल मैनिफेस्ट उत्पन्न करके आपके लिए ऐसा कर सकता है।

अद्यतन: आपका अंतिम सवाल परीक्षण करने के लिए कैसे है कि आपके बंडलों कार्यावधि में समस्याओं की खोज से पहले संगत कर रहे हैं पूछता है। बीएनडी की "सत्यापित" सुविधा है जो वास्तव में यह करती है। दरअसल यदि आप पहले स्थान पर मैनिफेस्ट उत्पन्न करने के लिए बीएनडी का उपयोग करते हैं, तो आपको सत्यापित सुविधा की आवश्यकता नहीं होगी। हालांकि, मुझे आपकी बिल्ड प्रक्रिया के बारे में कुछ भी पता नहीं है, इसलिए आपको अल्प अवधि में बीएनडी-आधारित निर्माण में जाना मुश्किल हो सकता है ... इस मामले में सत्यापन कार्य को पोस्ट-पोस्ट के रूप में जोड़ने के लिए अपेक्षाकृत सरल होगा। निर्माण के बाद प्रसंस्करण कदम। हालांकि मैं अभी भी निर्माण प्रक्रिया में बीएनडी का उपयोग करने की कोशिश करने की सिफारिश करता हूं।

+0

मुझे बीएनडी सत्यापन सुविधा के बारे में पता नहीं था, जानना बहुत अच्छा है! – amarillion

+3

"यदि आपका मेनिफेस्ट सही है" .... जिसका अर्थ है कि आपका मेनिफेस्ट बिल्कुल विशेष कार्यान्वयन के रूप में है, जिसका आप उपयोग कर रहे हैं, यह उम्मीद कर रहा है कि आप ओएसजीआई डिज़ाइनर और विशेष कार्यान्वयन के कोडर कुछ भी नहीं कर रहे हैं, आप हेवन ' टी के बारे में सोचा नहीं। मैं अमारियन से सहमत हूं - ओएसजीआई कक्षा के दुःस्वप्न को समस्या नहीं मिली है, इसके अलावा कोई भी समस्या निवारण तंत्र उपलब्ध नहीं है। यह अधिक तैनाती लचीलापन रखने वाले उपयोगकर्ताओं के लिए मूल्यवान हो सकता है, लेकिन यह डेवलपर्स के लिए अच्छा है। – user252690

+0

@ user252690 अज्ञात डरपोकों के लिए इंटरनेट पर अपमान के बारे में चिल्लाना आसान है। यदि आप शांत हो जाते हैं और कुछ सीखने का फैसला करते हैं, तो आप जानते हैं कि समझदार लोगों को कहां मिल सकता है। –

2

मुझे लगता है कि यहां समस्या यह है कि आप अपने बंडल द्वारा उपयोग किए गए पैकेज/कक्षाओं का सही सेट निर्दिष्ट नहीं कर रहे हैं (आपके मैनिफ़ेस्ट में आयात-पैकेज निर्देश का उपयोग करके)। जब तक ओएसजीआई उन लोगों के बारे में नहीं जानता, यह वास्तव में मदद नहीं कर सकता!

सुनिश्चित नहीं हैं कि कैसे आप अपने OSGi बंडलों का निर्माण कर रहे हैं, लेकिन आप Maven bundle plugin की जांच करनी चाहिए, कि स्पष्ट रूप से (कम से कम संकलन समय लोगों के लिए) आयात-संकुल को निर्दिष्ट करने की समस्याओं को हल करती है। http://wso2.org/library/tutorials/develop-osgi-bundles-using-maven-bundle-plugin#Importing%20packages देखें।

+0

+1। बस जोड़ने के लिए: मेवेन बंडल प्लगइन बीएनडी पर आधारित है, इसलिए बीएनडी का उपयोग करने के बारे में मेरे उत्तर में जो भी मैंने कहा वह भी मैवेन बंडल प्लगइन पर लागू होता है। यदि आपका निर्माण वर्तमान में मेवेन-आधारित नहीं है, तो इस कार्यक्षमता को प्राप्त करने के लिए मेवेन में जाने की कोई आवश्यकता नहीं है। –

1

मैं केंद्रीय प्रश्न का उत्तर नहीं दे रहा हूं, लेकिन इसी तरह की समस्या के लिए अपना समाधान प्रदान कर रहा हूं।

मेरे मामले में, मैं इस वर्ग संरचना था:

  • interface javax.script.ScriptEngineFactory
  • class pkga.A implements ScriptEngineFactory
  • class pkgb.B extends A

मेरा प्राथमिक परियोजना कोड वर्ग B में था और इस विस्तारित वर्ग A में एक निर्भर जार। का उपयोग करते हुए

<Export-Package>pkgb.*</Export-Package> 

अपर्याप्त था, मैं javax.script.ScriptEngineFactory की कमी के बारे में शिकायत कोई त्रुटि हुई। यह अजीब है क्योंकि यह मानक जेडीके 8 का हिस्सा है, ध्यान दें कि पैकेज pkgbमें कोड स्पष्ट रूप से संदर्भ javax.script.* नहीं था; शायद मेनिफेस्ट लेखक को यह नहीं पता था कि इस इंटरफ़ेस को निर्यात करने की आवश्यकता है?

मैंने पाया निर्यात-पैकेज के निर्देश को यह अतिरिक्त समस्या

<Export-Package>pkgb.*,javax.script.*</Export-Package>