2011-09-19 5 views
5

मैंने ग्रहण में एक बंडल बनाया, और "अवलोकन" टैब के लिए "फ्रेमवर्क लॉन्च" लिंक का उपयोग किया। मैंने अपने बंडल में एक इंटरफेस (टेस्ट सर्विस) बनाया है, और कोड जिसके लिए प्रॉक्सी उत्पन्न करना चाहिए (हेल्पर में)। मैं बंडल के उत्प्रेरक में इस कोड को कहते हैं, और मिलती है:आप ओएसजीआई बंडल के अंदर जावासिस्ट क्लासपूल कैसे बनाते/प्रारंभ करते हैं?

Caused by: javassist.NotFoundException: com.test.services.TestService 
at javassist.ClassPool.get(ClassPool.java:436) 
at com.test.services.Helper.get(Helper.java:46) 

यह पहली ClassPool.get() पर सही फेंकता है:

ClassPool pool = ClassPool.getDefault(); 
CtClass result = pool.get(TestService.class.getName()); 
... 

TestService सार्वजनिक है और एक ही पैकेज में, और बंडल, हेल्पर के रूप में, जो अपवाद उत्पन्न करता है। जाहिर है, यह केवल "ClassPool.getDefault()" करने के लिए पर्याप्त नहीं है। तो मुझे ऐसा करने की क्या ज़रूरत है ताकि क्लासपूल बंडल के अंदर कक्षाओं को देख सके? क्या मुझे अपना खुद का पैकेज आयात करना है?

+0

मुझे लगता है कि जावास्त्री बंडल को उन वर्गों की दृश्यता की आवश्यकता होगी जिन्हें आप लोड करने के लिए कह रहे हैं। दुर्भाग्यवश मुझे नहीं पता कि कैसे जावासवादी वर्गों को देखता है। क्या आप इसे बता सकते हैं कि कौन से क्लासलोडर का उपयोग करना है, या यह सिर्फ एक यादृच्छिक अनुमान लेता है? क्या इसे वास्तविक 'कक्षा' ऑब्जेक्ट्स के साथ कॉन्फ़िगर किया जा सकता है, या क्या यह स्ट्रिंग्स के रूप में आपूर्ति किए गए क्लासनामों पर जोर देता है? –

+0

मैं सिर्फ जावासिस्ट से शुरुआत कर रहा हूं, इसलिए मुझे यकीन नहीं है, लेकिन मैं इस शाम को देखूंगा और आपको जवाब दूंगा। लेकिन, मुझे संदेह है कि आपने पहले से ही उस समस्या को इंगित किया है; ओएसजीआई उन बंडल को सीमित करता है जो बंडल देख सकते हैं, इसलिए जावस्सिस्ट बंडल के "आयात पैकेज" में अपना खुद का पैकेज जोड़ने के लिए पर्याप्त हो सकता है। –

उत्तर

2

मैं फ्लाई पर जावा कक्षाओं को संशोधित/उत्पन्न करने के लिए कुछ ओएसजीआई बंडलों में जावासिस्ट का उपयोग करता हूं। आप बस here देख सकते हैं। उम्मीद है कि यह आपकी मदद करता है।

+0

मैं इसे अपने स्वयं के बंडल में जावसिट के साथ काम नहीं कर सका, क्योंकि मुझे एक परिपत्र निर्भरता मिलती है, लेकिन मुझे बस अपने कोड के साथ बंडल में जावसीत जार को एम्बेड करने का तरीका नहीं मिलता है। मुझे बस यह मानना ​​होगा कि यह काम करता है, जब तक मुझे मैन्युअल रूप से एम्बेडिंग (मेवेन का उपयोग न करने) पर उपयोग करने योग्य निर्देश मिलते हैं। –

+0

आप अपना ओएसजीआई बंडल बनाने के लिए किस टूल का उपयोग करते हैं? चींटी? आप जार एम्बेड करने और बंडल बनाने के लिए सीधे http://www.aqute.biz/Bnd/Bnd टूल का उपयोग कर सकते हैं। –

+0

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

10

हैं "स्रोत" ClassPool के लिए एक OSGi बंडल classloader द्वारा लोड एक वस्तु, आप संबंधित कर सकते हैं "classpath" (या classloader), इस तरह है:

pool.insertClassPath(new ClassClassPath(source.getClass())); 

या अपने मामले में बस

pool.insertClassPath(new ClassClassPath(TestService.class)); 

उम्मीद है कि यह मदद करता है।

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