Exception和Error分析(—)—UnsatisfiedLinkError

评价:
0
(0用户)

现象:

java.lang.UnsatisfiedLinkError:

Native Library xxx.dll already loaded in another classloader

at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1551)

at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1511)

at java.lang.Runtime.loadLibrary0(Runtime.java:788)

at java.lang.System.loadLibrary(System.java:834)

 

分析:

这种错误在我们使用热启动方式发布某个使用了JNI技术的Web应用时,并将调用年native方法的jar包独立部署在该应用下面,当我们的Web应用有了更新以后,在调用到该jar包封装的native方法时,会抛出该错误。(以上OSWindows,若是LinuxUnix,应该是xxx.so报错)

这是因为Web服务器已经在第一次加载该应用时,已经load了该dll,当该应用被再次热启动时,该dll将重新被加载,于是报错。

 

解决方案:

一、将含有JNI调用的jar包部署在Web服务器的公用lib库中。Web应用再发布时可以不用加载;

二、jar包部署不变,在该Web中实现一个listener,监听是否第一次启动,若不是第一次启动,屏蔽掉该jar包所含dll的加载。

注册并通过认证的用户才可以进行评价!

发帖时间: Java

发表评论