我在部署servlet时遇到问题。 servlet使用JNA加载一些DLL,这些DLL放在类路径com.myproject..etc中。 (例如" my_dll.dll"):
public static final MyDllInterface INSTANCE = (MyDllInterface) Native.loadLibrary("./com/myproject/main/jna/dll/my_dll", MyDllInterface.class);
只要我在测试类本地测试这些JNA接口,这就可以正常工作。一旦我将它们部署到glassfish(通过Netbeans),我就会遇到这样的错误:
java.lang.UnsatisfiedLinkError: Unable to load library './com/myproject/main/jna/dll/my_dll': The specified module could not be found.
我怀疑它与glassfish如何处理类路径有关,也可能与* .war压缩应用程序内部的加载有关。
我尝试过的事情:
有人可以帮忙吗?
(我在Windows上使用Netbeans 8.2,Glassfish 4.1.1(Netbeans附带)。在Windows C ++上编译DLL并使用我的测试代码)
答案 0 :(得分:0)
我想这个问题与java.library.path
有关,并且您正在将DLL文件打包到您的webapp中。不建议这样做。
关于变量java.library.path
:
当Java应用程序使用时加载本机库 System.loadLibrary()方法,扫描java.library.path 指定的库。如果JVM无法检测到请求 库,它抛出一个UnsatisfiedLinkError。最后,用法 本机库使Java程序更依赖于平台,因为它 需要存在特定的本地库。
因此,在Glassfish上,此变量通常设置为JVM文件夹和glassfish/lib
目录。
一种解决方案可能是将DLL文件放入文件夹glassfish/lib
并从loadLibrary()
来电中删除路径。
如果这不起作用或者不够便携,您可以尝试将java.library.path
设置为展开的WAR目录的路径(这是提取WAR文件内容的目录)当它部署在Glassfish上时。)
您可以通过Glassfish管理界面,asadmin
实用程序或直接在domain.xml
更改Glassfish域的变量。
以下是一个示例:-Djava.library.path=c:\somewhere\where\the\DLLs\are\located
展开的Web应用程序的路径应类似于:glassfish\domains\domain1\applications\YOUR_WEBAPPLICATION\WEB-INF\classes\whereTheDLLsAre\
。看看这个文件夹,确保DLL文件存在。
然后您的设置应该与此类似:
-Djava.library.path=c:\SOMETHIN\glassfish4\glassfish\domains\domain1\applications\YOUR_WEBAPPLICATION\WEB-INF\classes\whereTheDLLsAre\
另见: