2008-08-07 4 views
13

उदाहरण: मेरे पास दो साझा ऑब्जेक्ट हैं (समान रूप से .dlls पर लागू होना चाहिए)। पहली साझा वस्तु किसी तृतीय-पक्ष लाइब्रेरी से है, हम इसे libA.so कहते हैं। मैंने इनमें से कुछ को जेएनआई के साथ लपेट लिया है और अपनी खुद की लाइब्रेरी बनाई है, libB.so. अब libB libA पर निर्भर करता है।मैं जावा वेबस्टार्ट एकाधिक, आश्रित, देशी पुस्तकालय कैसे कर सकता हूं?

वेबस्टार्टिंग करते समय, दोनों पुस्तकालय कुछ वेबस्टार्ट कार्यक्षेत्र में स्थान होते हैं। मेरा जावा कोड libB लोड करने का प्रयास करता है। इस बिंदु पर सिस्टम लोडर libA लोड करने का प्रयास करेगा जो सिस्टम लाइब्रेरी पथ में नहीं है (java.library.path इससे मदद नहीं करेगा)। अंत परिणाम यह है कि libB के पास असंतुष्ट लिंक है और इसका उपयोग नहीं किया जा सकता है।

मैंने libB से पहले libA लोड करने का प्रयास किया है, लेकिन यह अभी भी काम नहीं करता है। ऐसा लगता है कि ओएस मेरे लिए लोड करना चाहता है। क्या कोई तरीका है कि मैं इस काम को स्थिर रूप से संकलित करने के अलावा कर सकता हूं?

उत्तर

2

स्टेटिक संकलन एकाधिक निर्भर देशी पुस्तकालयों को वेबस्टार्ट करने का एकमात्र तरीका साबित हुआ।

5

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

libB को काम करने से पहले libA लोड हो रहा है, जब तक कि उन पुस्तकालयों में से कोई एक निर्भरता नहीं है जो पथ में नहीं है और नहीं। मेरी समझ यह है कि एक बार जब यह सिस्टम लोड हो जाता है पुस्तकालय कॉल (यानी जावा ने पुस्तकालय को अपने java.library.path में पाया है और अब ओएस को इसे लोड करने के लिए कह रहा है) - यह किसी भी निर्भर पुस्तकालयों को खोजने के लिए ऑपरेटिंग सिस्टम पर पूरी तरह से निर्भर है , क्योंकि उस समय यह ऑपरेटिंग सिस्टम है जो प्रक्रिया के लिए लाइब्रेरी लोड कर रहा है, और ओएस केवल सिस्टम पथ को देखने के लिए जानता है। वेबस्टार्ट ऐप के मामले में सेट करना मुश्किल लगता है, लेकिन इसके आस-पास एक तरीका है जिसमें स्थैतिक संकलन शामिल नहीं है। आप अपने पुस्तकालय कहां शफल कर सकते हैं - मैं अनिश्चित हूं

यदि आप एक कस्टम क्लासलोडर का उपयोग करते हैं, तो आप लोड लाइब्रेरी और findLibrary को ओवरराइड कर सकते हैं ताकि यह आपके पुस्तकालयों को आपके क्लासपाथ में एक जार के भीतर से ढूंढ सके, और यदि आप भी इसे अपने मूल पुस्तकालय निर्भरताओं के बारे में अवगत कराएं (यानी libB पर निर्भर करता है libA libX पर निर्भर करता है, फिर libB लोड करते समय आप स्वयं को पकड़ सकते हैं और सुनिश्चित कर सकते हैं कि आप पहले libA लोड करें, और उस नोटिस को जांचने और पहले libX लोड करें। फिर ओएस कोशिश नहीं करता है एक पुस्तकालय है कि अपने रास्ते में नहीं है खोजने के लिए। यह klunky और थोड़ा दर्दनाक है, लेकिन जावा सुनिश्चित उन्हें और लोड पाता है उन्हें सही क्रम में सभी काम कर सकते हैं।

+1

क्लासलोडर्स समस्या को ठीक नहीं कर सकता क्योंकि ओएस मूल निर्भरताओं को हल करता है। – basszero

0

दोनों देशी में एक पर हस्ताक्षर किए जार पैक पुस्तकालयों हैं जो सूचीबद्ध है

<nativelib ...> 

जेएनएलपी फ़ाइल में?

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