2009-12-13 20 views
8

मैं हाल ही में जारी Glassfish v3 उपयोग कर रहा हूँ और जब तक देशी पुस्तकालयों glassfish का उपयोग कर रुक-रुक कर Glassfish देशी पुस्तकालय लोड हो रहा है (.dll, .so)

glassfish SEVERE: java.lang.UnsatisfiedLinkError: 
Native Library already loaded in another classloader

शिकायत करेगा प्रक्रिया पिछले glassfish रिलीज में देशी पुस्तकालयों लोड करने के लिए (v2। 2) बस GLASSFISH_HOME \ lib में .dll फ़ाइलों को रखना था। अब मुझे नहीं पता कि v3 में ऐसा जादू फ़ोल्डर है और यदि कोई बताना है। मैंने व्यवस्थापक स्क्रीन की भी जांच की है और मेरी समस्या से संबंधित दो चर हैं: मूल पुस्तकालय पथ उपसर्ग और मूल पुस्तकालय पथ प्रत्यय। मैं इंटरनेट का उपयोग कर रहा हूं ताकि वे क्या कर सकें और मुझे उनका उपयोग कैसे करना चाहिए, लेकिन जाहिर है कि कोई भी उनके बारे में बात करना पसंद नहीं करता है।

उत्तर

3

पहली बात: एक दिए गए देशी वर्ग को केवल एक वर्ग लोडर में लोड किया जा सकता है।

दूसरी बात: सर्वलेट कंटेनर में प्रत्येक वेब ऐप का अपना वर्ग लोडर होता है।

तीसरी बात: आपको मूल वर्ग कोडिंग में बहुत सावधान रहना होगा ताकि कक्षाओं को कचरा इकट्ठा किया जा सके।

परिणाम: एक बार जब आप वेबपैड में मूल कोड लोड करते हैं, तो आप इन त्रुटियों को प्राप्त करने की संभावना रखते हैं यदि आप इसे अनलोड करने और पुनः लोड करने का प्रयास करते हैं।

मैं कुछ हद तक, इस विषय पर वास्तव में सरल भिन्नता को छोड़ रहा हूं: बस एक ही मूल वर्ग के साथ दो अलग-अलग वेबपैप्स लोड करना।

कुछ लोग इस समस्या से बाहर रहने के लिए सिस्टम क्लास लोडर में देशी कोड लोड करना पसंद करते हैं।

4
java.lang.UnsatisfiedLinkError: Native Library already loaded in another classloader 

एक देशी lib केवल पर JVM में एक बार लोड किया जा सकता है और आप उस त्रुटि संदेश मिल जाएगा जब भी आप बुला वर्ग का एक नया संस्करण (वर्ग जहां System.loadLibrary(String) कॉल रहता है) लोड एक पुनर्वित्त नीचे इस पर अधिक।

प्रक्रिया पिछले glassfish रिलीज (v2.2) में देशी पुस्तकालयों लोड करने के लिए बस GLASSFISH_HOME\lib में .dll फ़ाइलें डाल करने के लिए किया गया था।

अच्छा, यह वास्तव में कहानी का पहला हिस्सा है। मूल पुस्तकालय लोड करने के लिए, आपको इसे जावा कोड से लोड करने के लिए लाइब्रेरी पथ और पर रखना होगा।

class FooWrapper { 
    static { 
     System.loadLibrary("foo"); 
    } 

    native void doFoo(); 
    } 
} 

मान लें कि आप एक वेब अनुप्रयोग के साथ काम कर रहे हैं, एक सबसे अच्छा अभ्यास करने के लिए WEB-INF/lib या WEB-INF/classes के तहत देशी पुस्तकालयों या उनके JNI इंटरफेस जगह नहीं है ऐसा करने के लिए, सम्मेलन इस तरह एक स्थिर प्रारंभकर्ता शामिल करने के लिए है जैसा ऊपर बताया गया है, आवेदन को फिर से लोड करते समय समस्याओं से बचें। दूसरे शब्दों में, System.loadLibrary(String) पर कॉल करने वाले वर्ग को एक क्लासलोडर द्वारा लोड किया जाना चाहिए जो वेब एप्लिकेशन को पुनः लोड करके प्रभावित नहीं होता है।

तो मेरा सवाल है: आपने यह कोड कहां रखा?

पीएस: एक और विकल्प यह जांचना होगा कि क्या यह लोड करने से पहले डीएल पहले से उपलब्ध है या नहीं, लेकिन मैं ऐसा नहीं करूँगा।

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