2009-09-11 11 views
5

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

मैं सोच रहा था कि मैं सीधे बंडल संग्रह में निष्पादन योग्य और आश्रित फ़ाइलों को शामिल कर सकता हूं और फिर बंडल शुरू होने पर प्रोग्रामेटिक रूप से कुछ निर्देशिका में निकाला जा सकता है। दूसरा विकल्प जो मैं सोच सकता हूं वह निष्पादन योग्य कहीं और रखना है और एक सिस्टम प्रॉपर्टी सेट करें जो इसे इंगित करता है या कुछ, लेकिन मैं न्यूनतम कॉन्फ़िगरेशन रखना चाहता हूं।

एक समाधान जो किसी विशेष ओएसजीआई कार्यान्वयन के लिए विशिष्ट नहीं है, अच्छा होगा, लेकिन यदि नहीं, तो मैं विषुव का उपयोग कर रहा हूं।

धन्यवाद!

उत्तर

2

आपका समाधान निश्चित रूप से काम करता है। लेकिन आपको इंस्टॉलेशन के दौरान निकाले गए और शुरू किए गए किसी भी संसाधन को रोकने और हटाने के लिए सावधान रहना होगा। निष्पादन योग्य किसी भी प्रकार की कार्यशील फाइलों के निर्माण में यह ट्रैक करना विशेष रूप से मुश्किल हो सकता है।

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

4

क्या इन अतिरिक्त फ़ाइलों को मूल कोड द्वारा लिखने योग्य होना चाहिए? यदि नहीं, तो आपको बंडल के अंदर अपनी पसंद की कोई भी फाइल डालने से रोक नहीं है।

ओएसजीआई में आपके पास सामान्य समस्या फाइल के पथ को काम कर रही है क्योंकि ओएसजीआई फाइल सिस्टम को नहीं मानता है (यह उतना अजीब नहीं है जितना लगता है कि ओएसजीआई एम्बेडेड डिवाइसों में शुरू हुआ है)।

आप कैसे नियंत्रित करते हैं कि मूल कोड अपनी संबंधित फाइलों को कहां देखता है? क्या आपको इसे एक रास्ता पारित करने की ज़रूरत है?

आप एक निर्देशिका कॉपी या सामान खोल चाहते हैं, तो का उपयोग करें:

org.eclipse.core.runtime.Platform.getStateLocation() 

जो तुम बंडल के लिए कार्यशील निर्देशिका देता है।

आप अपने बंडल में एक विशेष फ़ाइल के लिए पथ को खोजने के लिए चाहते हैं, आप कर सकते हैं:

org.eclipse.core.runtime.FileLocator.toFileURL((context.getBundle().getEntry("/etc/readme.txt"))) 

कौन, इस मामले में, वर्तमान बंडल में /etc/readme.txt के लिए एक फ़ाइल यूआरएल वापस आ जाएगी।

कोड के दोनों टुकड़े मानते हैं कि वे सक्रियकर्ता की start() विधि के अंदर हैं।

+0

ओएसजीआई सेवा प्लेटफार्म कोर विशिष्टता रिलीज 4 संस्करण 4.3 प्रदान करता है ['BundleContext.getDataFile (स्ट्रिंग)'] (https://osgi.org/javadoc/r4v43/core/org/osgi/framework/BundleContext.html#getDataFile% 28java.lang.String% 2 9), जो उचित हो सकता है। –

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