2012-05-17 10 views
17

में लोड किया गया है मेरे पास 2 जावा वेब ऐप्स हैं जिन्हें Windows एकीकृत प्रमाणीकरण का उपयोग कर SQL सर्वर डेटाबेस से कनेक्ट करने की आवश्यकता है।मूल पुस्तकालय sqljdbc_auth.dll पहले से ही किसी अन्य क्लासलोडर

पहले एक है कि लोड किया जाता है ठीक काम करता है, लेकिन दूसरा एक अपवाद फेंकता है:

Native Library sqljdbc_auth.dll already loaded in another classloader 

ऊपर त्रुटि तब होती है जब मैं एक फ़ोल्डर में sqljdbc_auth.dll जगह:

  • C: \ WINDOWS \ system32 \
  • C: \ Program Files \ Apache सॉफ्टवेयर फाउंडेशन \ बिलाव 7.0 \ बिन \

मैं नीचे से एक फ़ोल्डर में sqljdbc_auth.dll जगह:

  • /वेब-INF/lib प्रत्येक वेब अनुप्रयोग की निर्देशिका
  • C: \ Program Files \ Apache सॉफ्टवेयर फाउंडेशन \ बिलाव 7.0 \ lib \

    +०१२३५१६४१०: मैं ड्राइवर लोड करने के लिए इस कोड का उपयोग कर रहा

    Failed to load the sqljdbc_auth.dll cause :- no sqljdbc_auth in java.library.path 
    

    :

दोनों क्षुधा

अपवाद फेंक

Class.forName("jdbc:sqlserver://<HOST>;databaseName=<DBNAME>;integratedSecurity=true;"); 

मैं इसे कैसे हल कर सकता हूं?

उत्तर

26

प्रत्येक वेब एप्लिकेशन का अपना क्लासलोडर (उन्हें अलग करना) होता है। जब आप Class.forName() विधि को कॉल करते हैं, तो एक स्थिर ब्लॉक होता है जो साझा लाइब्रेरी (डीएलएल फ़ाइल) को लोड करने का प्रयास कर रहा है - इसलिए आपके वेब ऐप्स दोनों साझा lib को लोड करने का प्रयास कर रहे हैं, इसलिए त्रुटि संदेश जब दूसरा लोड करने का प्रयास करता है।

JDBC जार आप sqlserver के लिए है tomcat 7.0/lib फ़ोल्डर में, अपने युद्ध के साथ बंडल किया जा रहा से ले जाया जाना चाहिए और बिल्ला/bin फ़ोल्डर में sqljdbc_auth.dll कॉपी - इस तरह से यह बिल्ला माता पिता classloader में हो जाएगा, और कक्षा केवल एक बार लोड हो जाएगी।

|----------------------------------| 
| sqljdbc*.jar  --> tomcat*/lib | 
|----------------------------------| 
| sqljdbc_auth.dll --> tomcat*/bin | 
|----------------------------------| 
+0

जैसा कि मैंने अपने प्रश्न में कहा था, मैंने डीएलएल को पहले टोमकैट 7.0/lib में डालने की कोशिश की थी। आपके उत्तर के बाद, मैंने टॉमकैट 7.0/lib * s * बनाया और DLL को वहां रखा, और मुझे एक ही त्रुटि मिली: sqljdbc_auth.dll कारण लोड करने में विफल: - java.library.path – Gustavo

+0

में कोई sqljdbc_auth नहीं है I लिंक में पहले टॉमकैट क्लासलोडर के बारे में पढ़ा है: http://tomcat.apache.org/tomcat-7.0-doc/class-loader-howto.html लेकिन ऐसा लगता है कि टॉमकैट केवल .jar फ़ाइलों को लोड करता है , .dll फ़ाइलों नहीं। – Gustavo

+1

ठीक है, स्पष्टीकरण के लिए, आपको टॉमकैट/बिन फ़ोल्डर और jdbc ** jAR ** फ़ाइल में टॉमकैट/lib फ़ोल्डर में डीएल डालना होगा (क्षमा करें, lib पर अतिरिक्त एस पर मेरी गलती क्षमा करें, जिसे मैंने अभी सही किया है) –

1

मुझे लगता है कि आप सही रास्ते पर हैं।

कमांड लाइन स्टार्टअप के लिए आप आसानी से कोई sqljdbc_auth java.library.path में मुद्दे वातावरण चर

CATALINA_OPTS=-Djava.library.path=/path/to/dll 

सेटिंग आप एक सेवा के रूप बिल्ला चला रहे हैं द्वारा हल कर सकते हैं, विकल्प बदलने

HKEY_LOCAL_MACHINE\SOFTWARE\Apache Software Foundation\Procrun 2.0\Tomcat7\Parameters\Java

तहत पैरामीटर शामिल करने के लिए:

-Djava.library.path=/path/to/dll 
+1

में उत्तर के लिए धन्यवाद लेकिन पिछले एक ने इस मुद्दे को हल किया। – Gustavo

0

जैस्पर स्टूडियो में भी यही त्रुटि होती है।

शायद सबसे अच्छा समाधान नहीं है, लेकिन सी: \ प्रोग्राम फ़ाइलें (x86) \ TIBCO \ Jaspersoft Studio-6.1.0.final \ features \ jre.win32.win32.x86.feature_1.7.0 में sqljdbc4.jar रखें।u80 \ jre \ lib \ ext और sqljdbc_auth.dll सी: \ प्रोग्राम फ़ाइलें (x86) \ TIBCO \ Jaspersoft Studio-6.1.0.final \ features \ jre.win32.win32.x86.feature_1.7.0.u80 \ jre में \ bin

और यह काम करेगा।

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

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