2011-08-31 18 views
15

में जावा वेब एप्लिकेशन से ओएसजीआई बंडल का उपयोग करना मैं जावा वेब एप्लिकेशन से ओएसजीआई बंडल की एक विधि का आह्वान करने की कोशिश कर रहा हूं। दोनों को टॉमकैट 7 पर चलाना चाहिए।टॉमकैट

मैंने पहले से ही एक सामान्य जावा एप्लिकेशन लिखा है जो ओएसजीआई बंडल से विधियों को आमंत्रित करता है, जैसा कि इस साइट पर वर्णित है: http://drupal.osgibook.org/node/37

विषुव पर्यावरण के संदर्भ को प्राप्त करने के लिए मैंने इसे एप्लिकेशन से शुरू किया और बंडलों को भीतर से स्थापित किया। इसके अलावा संदर्भ का उपयोग चल रहे बंडल के सेवा संदर्भ को पुनः प्राप्त करने और इसकी सेवा प्राप्त करने के लिए किया गया था।

EquinoxRunner वर्ग के runEquinox विधि:

import org.osgi.framework.Bundle; 
import org.osgi.framework.BundleContext; 

public BundleContext runEquinox([...]) throws Exception { 
    [...] 

    BundleContext bundleContext = EclipseStarter.startup(new String[]{"-console"}, null); 
    bundleContext.installBundle("file:C:/.../plugins/myosgiclass.interface_1.0.0.201108301327.jar"); 
    Bundle bundleTranslationImpl = bundleContext.installBundle("file:C:/.../plugins/myosgiclass.impl_1.0.0.201108301327.jar"); 
    bundleTranslationImpl.start(); 

    [...] 
    return bundleContext; 
} 

और invokeMethod ServiceRunner वर्ग की: eclipse bridge का उपयोग कर

import org.osgi.framework.BundleContext; 
import org.osgi.framework.ServiceReference; 

[...] 

public Object invokeMethod(BundleContext bundleContext, Object value, [...]){ 
    ServiceReference serviceReference = bundleContext.getServiceReference(MyOSGiClass.class.getName()); 
    Object result = null; 
    if (serviceReference != null) { 
     MyOSGiClass myOSGiClass = (MyOSGiClass) bundleContext.getService(serviceReference); 
     if (myOSGiClass != null) result = myOSGiClass.method(value); 
     bundleContext.ungetService(serviceReference); 
    } 
    return result; 
} 

अब, बिलाव पर, मैं कैसे पुनः प्राप्त करने के पता नहीं है विषुव पर्यावरण का सही संदर्भ। जब मैं इसे इक्विनोक्स के साथ टॉमकैट पर चलाने का प्रयास करता हूं तो मुझे NoClassDefFound अपवाद प्राप्त होते हैं। मैं इस समस्या को हल करने के तरीके पर किसी भी सलाह की सराहना करता हूं।

बहुत पहले से धन्यवाद। चीयर्स, निक

+0

मुझे लगता है कि ओएसजीआई फ्रेमवर्क लॉन्च करने के नियंत्रण में कुंजी रखना है। मैं विषुव की सटीक कार्यप्रणाली से परिचित नहीं हूं, लेकिन मुझे यकीन है कि उनके पास फ़ेलिक्स के लिए वर्णित कुछ समान है: http://felix.apache.org/site/apache-felix-framework-launching-and -embedding.html –

+0

आपकी टिप्पणी के लिए धन्यवाद। यह वह दृष्टिकोण था जिसकी मैंने कोशिश की थी। यद्यपि मुझे अपनी परियोजना को टॉमकैट सर्वर पर चलाने की ज़रूरत है, उपरोक्त वर्णित ब्रिज की आवश्यकता है - और यह मैन्युअल रूप से शुरू नहीं हो सकता है। या क्या इस पुल को बाईपास करने और मैन्युअल रूप से ओएसजीआई फ्रेमवर्क शुरू करने का कोई तरीका है? – Nicolas

+0

मुझे नहीं लगता कि टॉमकैट का उपयोग करने से आप एक विशिष्ट सर्वलेट पुल कार्यान्वयन से कैसे जुड़ते हैं। आप 'org.eclipse.equinox.servletbridge' प्रोजेक्ट को कस्टमाइज़ करने के साथ क्यों शुरू नहीं करते? –

उत्तर

2

जब आप ऐसे ही एक OSGi ढांचे को एम्बेड करता है और उसके बाद बाहरी वातावरण से एक OSGi सेवा का उपयोग करना चाहते हैं, तो आप उस सेवा इंटरफ़ेस ही अंदर और OSGi के बाहर हैं सुनिश्चित करने के लिए की जरूरत है।

तो, अपने ओएसजीआई कंटेनर को टॉमकैट से ओएसजीआई तक अपने सेवा इंटरफ़ेस के पैकेज को निर्यात करने के लिए कॉन्फ़िगर करें। इसे प्राप्त करने के लिए, 'ओएसजीआई फ्रेमवर्क को' FRAMEWORK_SYSTEMPACKAGES_EXTRA 'संपत्ति के साथ कॉन्फ़िगर करें।

http://felix.apache.org/site/apache-felix-framework-launching-and-embedding.html#ApacheFelixFrameworkLaunchingandEmbedding-hostservices पर अधिक जानकारी (भले ही यह अपाचे फ़ेलिक्स के लिए है, एम्बेडिंग एपीआई मानकीकृत है)।

+0

एक अद्यतित लिंक: http://felix.apache.org/documentation/subprojects/apache-felix-framework/apache-felix-framework-launching-and-embedding.html – FableBlaze

2

मैंने पुल के साथ EclipseStarter सामान का उपयोग करने से पहले ऐसा किया है, और क्लासपाथ सामान को सही करने के लिए यह बहुत काम था। प्रतिबिंब का उपयोग करके आपको EclipseStarter पर भी कॉल करना होगा। ऐसा लगता है कि उन्होंने तब से इसे मानकीकृत किया है, इसलिए आपको EclipseStarter का उपयोग करने की आवश्यकता नहीं है।

यहाँ कुंजी (के रूप में संक्षेप Felix article में उल्लेख किया है कि आप अपने बिलाव पर्यावरण और अपने OSGi वातावरण के बीच एक साझा classpath के लिए होता है। आप खंड पर उस लेख में देखने के लिए शुरू कर रहा है, तो साथ "समूह द्वारा उपलब्ध कराई गई सेवाओं का उपयोग करना" , ऐसा लगता है कि आप क्या चाहते हैं।

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

0

मैंने जैस्पर क्लास लोडर को ओवरराइड करके इस चुनौती को पार कर लिया है, प्रत्येक बंडल क्या हो रहा है क्योंकि इसका अपना वर्ग लोडर क्लासडेफ्नफॉउंड है क्योंकि टॉमकैट लोडर का उपयोग किया जा रहा है। ऑनलाइन अधिक संसाधन हैं।

0

मुझे खेद है कि मैं सीधे आपके प्रश्न का उत्तर नहीं दूंगा ... मेरे दृष्टिकोण से आप अच्छे दृष्टिकोण नहीं लेते हैं, क्या आपके पास मौजूदा टोमकैट 7 उदाहरण का उपयोग करने का कोई मूल्यवान कारण है? मैं एक और ओएसजीआई केंद्रित दृष्टिकोण का उपयोग करूंगा, और अपने वेब एप्लिकेशन को प्रकाशित करने के लिए मानक एचटीपी सेवा का उपयोग करूंगा ... इस तरह के संदर्भ में दोनों घटक मानक ओएसजीआई बंडलों के समान स्तर पर हैं और इसके परिणामस्वरूप 2 घटकों के बीच संचार वास्तव में है आसान (प्रत्यक्ष विधि invokation या अतुल्यकालिक संदेश EventAdmin सेवा का उपयोग) HTH मेरी 2 सेंट जेरोम पुनश्च: इस दृष्टिकोण आप और अधिक लचीलापन प्रदान करता है, यह विषुव या किसी अन्य OSGi साथ इस्तेमाल किया जा सकता शैल आप चाहते हैं (फेलिक्स, knopflerfish। ।)