Exception和Error分析(―)―UnsatisfiedLinkError

现象:
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 方法时,会抛出该错误。(以上 OS Windows ,若是 Linux Unix ,应该是 xxx.so 报错)
这是因为 Web 服务器已经在第一次加载该应用时,已经 load 了该 dll ,当该应用被再次热启动时,该 dll 将重新被加载,于是报错。
 
解决方案:
一、 将含有 JNI 调用的 jar 包部署在 Web 服务器的公用 lib 库中。 Web 应用再发布时可以不用加载;
二、 jar 包部署不变,在该 Web 中实现一个 listener ,监听是否第一次启动,若不是第一次启动,屏蔽掉该 jar 包所含 dll 的加载。

你可能感兴趣的:(职场,休闲)