解决:java.lang.UnsatisfiedLinkError: Native Library *.dll already loaded in another classloader报错
@[BUG调试]解决:java.lang.UnsatisfiedLinkError: Native Library *.dll already loaded in another classloader报错一、报错:java.lang.UnsatisfiedLinkError: Native Library *.dll already loaded in another classloader..
@[BUG调试]
解决:java.lang.UnsatisfiedLinkError: Native Library *.dll already loaded in another classloader报错
一、报错:java.lang.UnsatisfiedLinkError: Native Library *.dll already loaded in another classloader
二、项目背景:SSM框架,使用InitializingBean接口类实现参数初始化
三、处理步骤:
-
通过断点调试发现:InitializingBean接口类中的afterPropertiesSet()方法被执行了两次,第二次初始化时报错。
-
首先尝试了解决afterPropertiesSet()调用两次的问题,进行了多次尝试都未能解决问题,时间关系于是开始从报错本身开始着手。
-
通过网上查阅同类报错的处理方法,筛选后发现博主waiting_alone(https://blog.csdn.net/ld422586546/article/details/14522721)写的符合我的报错类型,错误发生原因是使用System.loadLibrary方法调用dll文件时,JVM只允许一个加载器来调用,因此第二次调用时无法清除已经调用的dll。里面提到将调用dll的代码单独封装成一个jar,将这个jar放到jre/lib/ext或tomcat/lib下。找到我调用报错dll的类为Queue.java,因为这个类中引用了其他两个类,于是将其他两个类也一起打包成jar包。
这里参考了一下博主Angel挤一挤 的方法(https://www.cnblogs.com/sxdcgaq8080/p/8126770.html) -
首先将我需要打包的三个java类单独剪切出来,因为涉及到引用路径,所以要讲该java类的父目录也一起创建出来,比如我这里之前引用该类路径是import ionic.Msmq.Queue;则需要将ionic.Msmq目录也创建出来,如图所示:
-
打包成jar前需要将java文件转为class文件,打开cmd,进入java类所在目录
因为要将三个都打包,所以直接将文件夹下所有java转为class,不然会报错字符无法识别。执行:javac –encoding utf-8 *.java
(我这里执行的时候报错javac为外部命令,该错一般是java环境变量没有配置好,重新配置一遍即可)
编译完成后将java文件删除 -
回退到ionic的父目录,执行jar –cvf MsmqJava.jar ionic(MsmqJava.jar是要打包成jar名,ionic是要打包的目录)
-
最后将生成的jar引入到原项目中后,再将该jar包添加到jre/lib/ext文件夹下。运行正常,报错解决。(注意这里jre目录有两个,一个是jdk里面的,一个是jdk同级的,我试了两台电脑,一台需要放在jdk下的jre目录中,一台需要放在jdk同级的jre中,保险起见建议两个都放)
四、参考网址:
[1]https://blog.csdn.net/ld422586546/article/details/14522721
[2]https://www.cnblogs.com/sxdcgaq8080/p/8126770.html
[3]https://jingyan.baidu.com/article/08b6a591bdb18314a80922a0.html
更多推荐
所有评论(0)