मैं जावा वेबस्टार्ट एकाधिक, आश्रित, देशी पुस्तकालय कैसे कर सकता हूं?

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

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

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

0
ro fr bn

3 उत्तर

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

0
जोड़ा

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

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

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

0
जोड़ा
क्लासलोडर्स समस्या को ठीक नहीं कर सकते क्योंकि ओएस मूल निर्भरताओं को हल करता है।
जोड़ा लेखक basszero, स्रोत

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

 

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

0
जोड़ा