Adam Batkin'in orijinal cevabı sizi bir çözüme götürecek, ancak web uygulamanızı yeniden konuşlandırırsanız (web kapsayıcınızı yeniden başlatmadan), aşağıdaki hatayla karşılaşmalısınız:
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)
Bunun nedeni, DLL'nizi orijinal olarak yükleyen ClassLoader'ın hala bu DLL'ye başvurmasıdır. Ancak, web uygulamanız artık yeni bir ClassLoader ile çalışıyor ve aynı JVM çalıştığı ve bir JVM aynı DLL için 2 referansa izin vermediği için onu yeniden yükleyemezsiniz . Bu nedenle, web uygulamanız mevcut DLL'ye erişemez ve yeni bir tane yükleyemez. Yani ... sıkıştın.
Tomcat'in ClassLoader belgeleri , yeniden yüklenen web uygulamanızın neden yeni, yalıtılmış bir ClassLoader'da çalıştığını ve bu sınırlamayı nasıl aşabileceğinizi (çok yüksek düzeyde) özetliyor.
Çözüm, Adam Batkin'in çözümünü biraz genişletmek:
package awesome;
public class Foo {
static {
System.loadLibrary('foo');
}
public static void main(String[] args) {
}
}
Ardından, SADECE bu derlenmiş sınıfı içeren bir kavanozu TOMCAT_HOME / lib klasörüne yerleştirin.
Şimdi, web uygulamanızda, Tomcat'i bu sınıfa başvurmaya zorlamanız yeterlidir, bu da şu kadar basit bir şekilde yapılabilir:
Class.forName("awesome.Foo");
Artık DLL dosyanızın ortak sınıf yükleyiciye yüklenmesi gerekir ve yeniden konuşlandırıldıktan sonra bile web uygulamanızdan referans alınabilir.
Mantıklı olmak?
Google kodunda, static-dll-bootstrapper'da bir çalışma referans kopyası bulunabilir .