Câu trả lời ban đầu của Adam Batkin sẽ dẫn bạn đến một giải pháp, nhưng nếu bạn triển khai lại ứng dụng web của mình (mà không khởi động lại vùng chứa web của bạn), bạn sẽ gặp phải lỗi sau:
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)
Điều này xảy ra vì ClassLoader đã tải DLL của bạn ban đầu vẫn tham chiếu đến DLL này. Tuy nhiên, ứng dụng web của bạn hiện đang chạy với ClassLoader mới và vì cùng một JVM đang chạy và một JVM sẽ không cho phép 2 tham chiếu đến cùng một DLL, bạn không thể tải lại nó. Do đó, ứng dụng web của bạn không thể truy cập DLL hiện có và không thể tải tệp mới. Vì vậy, .... bạn đang mắc kẹt.
Tài liệu về ClassLoader của Tomcat phác thảo lý do tại sao ứng dụng web được tải lại của bạn lại chạy trong ClassLoader cô lập mới và cách bạn có thể khắc phục hạn chế này (ở mức rất cao).
Giải pháp là mở rộng giải pháp của Adam Batkin một chút:
package awesome;
public class Foo {
static {
System.loadLibrary('foo');
}
// required to work with JDK 6 and JDK 7
public static void main(String[] args) {
}
}
Sau đó, đặt một jar chứa JUST lớp đã biên dịch này vào thư mục TOMCAT_HOME / lib.
Bây giờ, trong ứng dụng web của bạn, bạn chỉ cần buộc Tomcat tham chiếu đến lớp này, điều này có thể được thực hiện đơn giản như sau:
Class.forName("awesome.Foo");
Bây giờ DLL của bạn sẽ được tải trong trình tải lớp chung và có thể được tham chiếu từ ứng dụng web của bạn ngay cả sau khi được triển khai lại.
Có lý?
Bạn có thể tìm thấy bản sao tham chiếu đang hoạt động trên mã google, static-dll-bootstrapper .