2009-06-23 13 views
20

मेरे पास टॉमकैट 3.2.1 के तहत चल रहा एक वेबपैप है जिसे विरासत सी ++ कोड में डेटा और विधियों तक पहुंचने के लिए क्रम में जेएनआई कॉल करने की आवश्यकता है। एक सर्वलेट webapp अपने init विधि के भाग के रूप, का कारण बनता है कि, एक डेटा सेट कि webapp उदाहरण के लिए विशिष्ट सी ++ डेटा संरचनाओं में लोड करने के लिए की स्टार्टअप पर भरी हुई है।.dll पहले से ही किसी अन्य क्लासलोडर में लोड हो गया है?

इस सर्वलेट के लिए यह जावा कोड निम्नलिखित शामिल हैं:

static 
{ 
    try { 
     System.loadLibrary("JCoreImpl"); 
     System.out.println("JCoreImpl loaded"); 
     m_bLibraryLoaded = true; 
    } catch (UnsatisfiedLinkError e) { 
     m_bLibraryLoaded = false; 
     System.out.println("JCoreImpl NOT loaded " + e); 
    } 
} 

चीजें ठीक से काम करता है, तो वहाँ केवल एक webapp है (यह "webapps/aaa" कहते हैं)।

अगर मैं ("webapps/bbb") कि webapps के समान है एक दूसरे webapp है/aaa सी ++ डेटा संरचनाओं में इस्तेमाल किया डेटा सेट, के अलावा तो webapps/aaa अप ठीक शुरू होता है, लेकिन जब webapps/bbb शुरू कर दिया है मैं बताने वाला कोई त्रुटि मिलती है:

JCoreImpl NOT loaded java.lang.UnsatisfiedLinkError: Native Library 
E:\WebStation\binDebug\JCoreImpl.dll already loaded in another classloader 

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

उत्तर

13

आप एक ही मूल पुस्तकालय को दो बार लोड नहीं कर सकते हैं।

कक्षा को एक जार फ़ाइल में/lib/के अंतर्गत रखें, इसे सभी युद्धों पर साझा किया जाएगा।

0

एक अस्थायी निर्देशिका में अस्थायी फ़ाइलों को DLLs कॉपी पर अनुभाग I'm encountering classloader problems when using JNI under Tomcat देखें। जब आप कर लेंगे तो फ़ाइलों को हटाएं। इस तरह आप यह सुनिश्चित कर सकते हैं कि एक ही डीएलएल दो बार लोड नहीं होता है।

0

मैं इस समस्या थी और मैं इसे हल:

समस्या:

समस्या अपने आवेदन सर्वर के कुछ विन्यास जो और एक से अधिक war या ear फ़ाइलों को बनाने के कारण फलस्वरूप यह की वजह से है एक से अधिक तैनात फाइलें बनाता है। ये तैनात फाइलें आपकी मूल लाइब्रेरी में एक समवर्ती पहुंच का प्रयास करती हैं जो स्थिर ब्लॉक में लोड होती है।

समाधान:

  1. अपने अनुप्रयोग सर्वर आईडिया
  2. समाप्त करना बंद करो और उसे बंद कार्य प्रबंधक
  3. जाओ से सभी java प्रक्रियाओं अपने अनुप्रयोग सर्वर के इस पते पर: jboss-eap-6.4.0\standalone\configuration और खुले standalone.xml फ़ाइल
  4. standalone.xml में, सभी deployments टैग हटाएं (चिंता न करें, जब आप एप्लिकेशन को दोबारा शुरू करते हैं jboss-eap-6.4.0\standalone\deployments और हटाने के सभी तैनात फ़ाइलें और war फाइलें: आर, यह इस टैग
  5. अपने अनुप्रयोग सर्वर के इस पते पर डाल देता है।
  6. ओपन IntelliJ विचार और (आप बैकअप अपने युद्ध फ़ाइलों कर सकते हैं) के लिए जाना: संपादित विन्यास JBoss -> तैनाती टैब
  7. वर्तमान तैनाती हटाएँ और एक नया एक है कि होना चाहिए जोड़ने exploded
संबंधित मुद्दे

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