明天的明天 永远的永远 未知的一切 我与你一起承担 ??

是非成败转头空 青山依旧在 几度夕阳红 。。。
  博客园  :: 首页  :: 管理

错误:

Tomcat 项目和supermap iserver war包中使用了相同的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 方法. 


解决方法:  https://www.cnblogs.com/Fooo/p/17574516.html (Tomcat引用超图java object的几个jar排除不打包)

将Tomcat引用超图java object的几个jar排除不打包,iserver解压后的war包有com.supermap.*jar放到jre安装目录下 /lib/ext或tomcat/lib下, 注意和iserver相同版本号,含小版本号

 

 

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