Adam Batkin 的原始答案将引导您找到解决方案,但如果您重新部署您的 web 应用程序(不重新启动您的 web 容器),您应该会遇到以下错误:
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)
发生这种情况是因为最初加载您的 DLL 的 ClassLoader 仍然引用此 DLL。但是,您的 web 应用程序现在正在使用新的 ClassLoader 运行,并且因为相同的 JVM 正在运行并且 JVM 不允许对同一个 DLL 进行 2 次引用,所以您不能重新加载它。因此,您的 webapp 无法访问现有的 DLL,也无法加载新的 DLL。所以....你被卡住了。
Tomcat's ClassLoader documentation 概述了为什么您重新加载的 web 应用程序在一个新的隔离 ClassLoader 中运行,以及您如何解决这个限制(在非常高的层次上)。
解决方案是稍微扩展 Adam Batkin 的解决方案:
package awesome;
public class Foo {
static {
System.loadLibrary('foo');
}
// required to work with JDK 6 and JDK 7
public static void main(String[] args) {
}
}
然后将包含 JUST 这个编译类的 jar 放入 TOMCAT_HOME/lib 文件夹中。
现在,在你的 webapp 中,你只需要强制 Tomcat 引用这个类,就可以这么简单地完成:
Class.forName("awesome.Foo");
现在您的 DLL 应该在公共类加载器中加载,并且即使在重新部署后也可以从您的 web 应用程序中引用。
有意义吗?
可以在 google 代码static-dll-bootstrapper 上找到工作参考副本。