java中tomcat 加载动态库XXX.dll报错“java.lang.UnsatisfiedLinkError: already loaded in another classloader”[supermap java iobject + iserver war]

发布时间 2023-07-22 20:29:31作者: 且行且思

错误:

在Tomcat 和supermap iserver 中使用了相同的supermap java iobject 【四个jar 包】,实际的访问过程如下:

这时候在访问Tomcat的时候,就会出现一个错误:

an exception caught at Environment.loadLibrary(), program will continue running.
java.lang.UnsatisfiedLinkError: Native Library D:\supermap-iobjectsjava-10.2.0\objectsjava\bin\WrapjCore.dll already loaded in another classloader

 

原因:

JVM只允许一个默认的ClassLoader来load native library,并不提供专门的API来unload一个loaded native library,因此无法在我们的重启Web应用的代码中来手工清除已经load的dll,也没有相应的unload native 方法. 


解决方法:

将Tomcat引用的几jar放到jre/lib/ext或tomcat/lib下

解决这个问题其实很简单,放到java的systemLoader可以加载的地方,如lib/ext目录下。然后,项目中 仍然去调用此代码。由于访问dll的代码由systemLoader加载,因此,多个项目同时访问同一个dll时,即可避免再次加载了。因为,第二个项目 在访问时,寻找到的类,已经被systemLoader加载过了,因此项目本身的classLoader就不会再去加载这个类了。