एडम बैटकिन का मूल उत्तर आपको एक समाधान की ओर ले जाएगा, लेकिन यदि आप अपने वेबएप को पुनः आरंभ करते हैं (अपने वेब कंटेनर को फिर से शुरू किए बिना), तो आपको निम्नलिखित त्रुटि में भाग लेना चाहिए:
java.lang.UnsatisfiedLinkError: Native Library "foo" already loaded in another classloader
at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1715)
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1646)
at java.lang.Runtime.load0(Runtime.java:787)
at java.lang.System.load(System.java:1022)
ऐसा इसलिए होता है क्योंकि ClassLader जो मूल रूप से आपके DLL को लोड करता है, वह अभी भी इस DLL को संदर्भित करता है। हालाँकि, आपका वेबप अब एक नए क्लासमैलर के साथ चल रहा है, और क्योंकि वही JVM चल रहा है और एक JVM एक ही DLL के 2 संदर्भों की अनुमति नहीं देगा, आप इसे पुनः लोड नहीं कर सकते । इस प्रकार, आपका webapp मौजूदा DLL तक नहीं पहुँच सकता है और एक नया लोड नहीं कर सकता है। इसलिए .... आप फंस गए हैं।
टॉमकैट के क्लास-लॉर्ड डॉक्यूमेंट की रूपरेखा यह बताती है कि आपका पुनः लोड किया गया व्हाट्सएप एक अलग-थलग पड़े क्लास-क्लास में क्यों चलता है और आप इस सीमा के आसपास (बहुत उच्च स्तर पर) कैसे काम कर सकते हैं।
समाधान है कि एडम बाटकिन के समाधान को थोड़ा बढ़ाया जाए:
package awesome;
public class Foo {
static {
System.loadLibrary('foo');
}
// required to work with JDK 6 and JDK 7
public static void main(String[] args) {
}
}
तब TOMCAT_HOME / lib फ़ोल्डर में JUST में इस संकलित वर्ग वाले जार को रखना।
अब, अपने वेबएप के भीतर, आपको बस टॉम्कट को इस वर्ग को संदर्भित करने के लिए बाध्य करना होगा, जिसे बस इस प्रकार किया जा सकता है:
Class.forName("awesome.Foo");
अब आपके DLL को सामान्य क्लास लोडर में लोड किया जाना चाहिए, और फिर से तैयार किए जाने के बाद भी आपके वेब से संदर्भित किया जा सकता है।
सही बात?
एक वर्किंग रेफरेंस कॉपी google code, static-dll-bootstrapper पर मिल सकती है ।